RSS Telegram YouTube Apple Яндекс Spotify Google Amazon Почта

38. Go 1.22

11.02.2024

Скачать

К списку выпусков

Ссылки выпуска:

Go 1.22

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.