Сьогодні відбувся реліз Go 1.21 і в цій статті хочу пройтися по найбільш цікавим новинкам.
Profile guided optimization
Сучасні компілятори дуже потужні і розумні, тому часто згенерований машинний код є кращим і більш оптимізованим, ніж нам би вдалося його написати самим (звичайно, за розумний проміжок часу). Але тим не менш, часом можна зробити краще, оскільки компілятор керується загальними правилами та евристиками при оптимізації. За допомогою Profile Guided Optimization (PGO) розробники можуть скачати файл, згенерований профайлером, і наступного разу, при створенні бінарника, використати цей файл для того, щоб на базі реального виконання програми здійснити ті чи інші оптимізації. Наприклад, профайлер може записати, що ваша функція дуже часто використовується в цьому коді, тому можна її вписати (inline). Розробники стверджують, що таким чином новий бінарник буде на 2-7% продуктивнішим. Збереження не видаються дуже великими, але коли у вас тисячі копій якогось сервісу, то така проста річ може заощадити вам не одну тисячу доларів.
Нові вбудовані функції
Це мабуть річ, яку всі дуже давно просили. Мені самому приходилось не один десяток разів писати функції min
та max
і нарешті після 20 релізів вони були добавлені. З цікавого:
- Вони працюють з довільною кількістю аргументів (мінімум один). Наприклад можна написати
min(100), max(-1,10), min(8,5,3,2,1)
. - Функції приймають тільки впорядковані типи (Ordered), тобто всі типи цілих, з плаваючою комою та стрічки.
До того маємо ще функцію clear
. Тут трошки змішані відчуття. На даний момент ця функція працює з трьома типами аргументів:
map
– очищує, видаляючи всі елементи. Тобто структура даних стає пустою.slice
– очищує, заміняючи всі елементи нульовим значенням. Тобто кількість елементів не змінюється.type parameter
. Якщо коротко, воно робить те саме що в пункті 1 або 2, в залежності від переданого параметру. Головне щоб тип змінної бувslice
абоmap
. Нижче приклад:
func cleanExample[T []P, P cmp.Ordered](v T) {
clear(v)
}
log/slog пакет
Насправді цей пакет заслуговує окремої статті. Але тим не менш це перша проба добавити стандартний спосіб для структурованого створення логів. Тепер можна змінювати формат тексту, можна виводити у вигляді JSON. Можна задавати пари ключ-значення, які будуть присутні в логах, а також автоматично включати інформацію з контексту. Рекомендую, ознайомитися з офіційною документацією, а я в майбутньому спробую описати свій досвід.
Пакети slices та maps
Дві великі бібліотеки, що містять десяток корисних функцій для роботи зі слайсами та мапами. Нижче список доступних функцій в пакеті slices:
- BinarySearch – функція бінарного пошуку в посортованому слайсі.
- Clip – звільняє невикористану пам’ять слайса.
- Clone – копіює слайс.
- Compact – забирає дублікати з посортованого слайсу (щось типу uniq).
- Compare – порівнює два слайси.
- Contains – перевірка чи елемент є в масиві.
- Delete – видаляє елементи зі слайсу.
- Equal – подібно до Compare, але повертає тільки true або false.
- Grow – збільшує пам’ять для слайса.
- Index – подібно до Contains, але повертає індекс елемента.
- Insert – вставляє елемент в слайс.
- IsSorted – перевіряє чи елементи в слайсі посортовані.
- Max/Min – максимальний та мінімальні елементи в слайсі відповідно.
- Replace – заміняє елементи в проміжку слайса на переданий елемент.
- Reverse – слайс в зворотньому порядку.
- Sort – функція для сортування.
Більша частина має дві версії одна працює зі стандартними типами comparable та cmp.Ordered, а інша приймає функцію яка може здійснювати порівняння елементів. Наприклад:
func Max[S ~[]E, E cmp.Ordered](x S) E
func MaxFunc[S ~[]E, E any](x S, cmp func(a, b E) int) E
Також варто зауважити, що деякі функції дозволяють працювати з слайсами різних типів. Наприклад подивимося на опис функції CompareFunc:
func CompareFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, cmp func(E1, E2) int) int
Як видно, функція приймає два слайси типу []E1 та []E2, а також функцію, що порівнює елементи типу E1, E2.
Перейдемо тепер до пакету Maps:
- Clone – створює точну копію map
- Copy – копіює елементи з одного map в інший (старі елементи залишаються)
- DeleteFunc – видаляє всі елементи, які відповідають предикату.
- Equal та EqualFunc – перевіряє чи дві мапи рівні.
Як бачимо тут список куди менший, але в мене відчуття, що нові функції будуть добавлені в наступних релізах.
Пакет cmp
Новий пакет містить лише дві нові функції та інтерфейс:
func Compare[T Ordered](x, y T) int
– повертає -1, 0 або 1 в залежності від того який з двох елементів більший.func Less[T Ordered](x, y T) bool
– повертає true якщо перший аргмент менший за другий.type Ordered interface{...}
– який містить список стандартних типів, що можна впорядкувати (int, float, string,…)
Підсумок
Як на мене останні кілька релізів принесли в Go більше можливостей з функціональної точки зори ніж попередні 10. Надіюся, що стандартні бібліотеки будуть розширюватися, але водночас я не хотів би, щоб збільшувала кількість вбудованих функцій. Наприклад min та max спокійно могли бути функціями всередині cmp пакету (або якогось іншого).
Залишити відповідь