Go 1.22 вышел 6 февраля 2024. В этом выпуске поговорим о главных изменениях.
Итератор цикла for теперь будет в области видимости одной итерации, а не всего цикла. Это позволит избежать частых ошибок при вызове go-рутин внутри цикла с использованием итератора. Даже опытные разработчики допускают ошибки связанные с замыканиями и итераторами. Например, задокументированная проблема, связанная с этим поведением обнаружилась 4 года назад, связана с речекером в Let's Encrypt (некритичный баг): выдача сертификата на основе CAA-записи возможна только единожды в течение 8 часов. Если прошло более 8 часов с момента последней проверки, то нужно проверить CAA-запись заново. Проблема случилась как раз с циклом проверки этих CAA-записей. Вместо нескольких доменов проверялся один и тот же (последний). Переменная-итератор будет переприсваиваться для каждой итерации цикла и в замыкании (кложуре) будет использоваться копия. Этот функционал уже был доступен в Go 1.21, но только в экспериментальном режиме. В Go 1.22 он станет стандартным.
range для integer позволяет быстро проитерироваться по числовому ряду от 0 до n, где n - целое неотрицательное число. Ничего сверх этого. Напомню, что range - это клауза для итерации for-цикла по элементам массива, строки, map, канала. В каждом случае range возвращает разный набор значений.
Улучшение производительности рантайма Go: почти все Go-прогаммы будут потреблять на 1% меньше RAM и CPU благодаря оптимизации работы с памятью. Тут стоит напомнить про связь памяти и производительности CPU. Чем меньше памяти потребляет программа, тем больше ресурса в кешах процессора (L1, L2, L3). Меньше памяти - быстрее работает сборщик мусора.
2-14% ускорения программ с PGO.
PGO - это техника оптимизации, при которой программа компилируется с учетом результата её профайлинга.
Включаем runtime/pprof
, запускаем профилировщик, складываем результат профилирования в
default.pgo
и кладем рядом с main.go
файлом. Выполняем go build
еще раз
и на выходе получаем оптимизированную версию программы. Если ваша программа использует много рефлексии,
например, JSON кодирование-декодирование, то PGO может ускорить вашу программу.
Добавление math/rand/v2
в SDK помимо быстрых алгоритмов генерации случайных чисел
привнесло и стандарт для Go SDK по версионированию пакетов. Теперь новая версия пакета будет размещаться в
оригинальной директории с префиксом vN
, где N - это номер версии.
Пакет в директории vN
будет по прежнему иметь имя math/rand
.
Генератор случайных числе в math/rand
не должен использоваться для длинной последовательности чисел,
т.к. он дает предсказуемый результат. Вместо этого рекомендуется использовать crypto/rand
пакет.
В новом пакете старый (первые имплементации датируются серединой прошлого века,
в Go использовалась одна из многих его вариаций)
добрый (и невероятно простой в имплементации) алгоритм LFSR заменен на более современные
ChaCha8
(2008 год) и PCG
(2014 год).
Добавлены URL-паттерны в ServeMux и теперь можно указывать в строке методы HTTP-запроса,
а также параметры подстановки в фигурных скобках. В паттерне можно указывать спец символы:
{$}
- конец строки;
{name}
- параметр подстановки (может занимать только целый сегмент);
{name...}
- именованное окончание URL-пути.
Получать значением параметра подстановки можно с помощью метода PathValue("name")
.
Добавлена функция slices.Concat
для слияния N слайсов.
По прежнему в Go нет generic функций Map, Filter, Reduce
, но это было намеренное решение.
Ожидается, что эти функции должны стать частью streams API.