Вышел Go 1.20. Обзор под катом

Команда разработчиков Go представила Go 1.20. Загрузить его можно здесь.

Благодаря раннему обширному тестированию и повышенной общей стабильности кодовой базы была расширена фаза разработки — и это пошло на пользу Go 1.20. За подробностями приглашаем под кат, а за полезной теорией и практикой — на наш курс по Backend-разработке на Go.

Особенно радостно выпустить предварительную версию профильно-управляемой оптимизации (Profile-Guided Optimization, PGO). Она позволяет компилятору выполнять специфические для приложения оптимизации на основе информации о профиле времени выполнения. Учёт профиля в go build позволяет компилятору повысить скорость выполнения приложения в среднем на 3–4%. Ма надеемся, что в будущих выпусках PGO станет ещё эффективнее. Поддержка PGO находится в предварительной стадии, поэтому смело экспериментируйте с ней, но учтите, что в ней есть проблемы, способные помешать применению PGO в продакшене.

В Go 1.20 включён ряд изменений языка, множество улучшений инструментов и библиотек, повышена общая производительность.


Изменения языка


  • Предопределённое ограничение сравнимости (comparable) теперь удовлетворяется обычными сравнимыми типами, такими, как интерфейсы. Это упрощает код.


  • Функции SliceData, String и StringData добавлены в пакет unsafe. Они дополняют набор функций для низкоуровневых манипуляций со срезами (срезы также называют слайсами) и строками.


  • Правила преобразования типов данных теперь допускают прямое преобразование слайса в массив.


  • Спецификация языка определяет точный порядок, по которому сравниваются элементы массива и поля структур. Это проясняет происходящее при панике во время сравнения.


  • Утилита cover теперь может собирать coverage-профили всей программы, а не только юнит-тестов.


  • Утилита go больше не связана с предварительно скомпилированными пакетами стандартной библиотеки в папке $GOROOT/pkg. Они исключены из дистрибутива, дистрибутив стал меньше. Теперь все пакеты собираются по мере необходимости и кешируются в кеше сборки.


  • Надёжность go test -json повышена для случаев, когда в stdout есть ошибочные символы.


  • go build, go install и другие связанные со сборкой команды теперь принимают флаг профильно-управляемой оптимизации -pgo, а также флаг -cover для coverage-анализа всей программы.


  • Команда go теперь по умолчанию отключает cgo на системах без инструментария сборки кода на С. Таким образом, на системах без компилятора C теперь используются варианты пакетов стандартной библиотеки на чистом Go с опциональным использованием cgo, а не предварительно скомпилированные пакеты, которые удалены из дистрибутива.


  • Утилита vet выводит больше предупреждений о проблемах с переменными в циклах, которые возникают при параллельном запуске тестов.



Что добавлено в стандартную библиотеку


  • Пакет crypto/ecdh поддерживает обмен ключами по протоколу Диффи-Хеллмана на эллиптических кривых c NIST-кривыми и Curve25519.
  • Функция errors.Join возвращает ошибку, в которую упакован список ошибок. Их можно получить, если тип ошибки содержит метод Unwrap() []error.
  • Тип http.ResponseController предоставляет доступ к расширенным обработчикам HTTP-ответов, которые не обрабатываются интерфейсом http.ResponseWriter.
  • В перенаправляющий прокси httputil.ReverseProxy взамен хука Director добавлена новая функция Rewrite.
  • Функция context.WithCancelCause позволяет отменить вызов с указанием ошибки. Эту ошибку можно получить, вызвав новую функцию context.Cause.
  • Поля Cancel и WaitDelay в os/exec.Cmd, определяющие поведение Cmd при отмене связанного Context или завершении процесса.


Повышение производительности


  • Компилятор и сборщик мусора потребляют меньше памяти, а повышение общей производительности ЦПУ может достигать 2%.
  • Улучшена компиляция, а скорость сборки теперь снова как в Go 1.17; прирост скорости может составлять до 10%.

При сборке Go 1.20 из исходного кода требуется Go 1.17.13 или более новая версия, а инструментальную цепочку для бутстрэппинга мы планируем обновить в будущем. С версии Go 1.21 прекращается поддержка некоторых старых операционных систем, включая Windows 7, 8, Server 2008 и Server 2012, macOS 10.13 High Sierra и 10.14 Mojave, но добавлена экспериментальная поддержка FreeBSD на архитектуре RISC-V.

Полный подробный список всех изменений вы найдёте в тексте примечаний к выпуску.

Спасибо всем, кто помогал писать код, сообщал об ошибках, делился своими впечатлениями и тестировал релиз-кандидаты. С вашей помощью Go 1.20 стал намного лучше. И как обычно, если вы обнаружите ошибку, сообщите нам о ней.

Источник

cqna880todtt287i6ffb12uzzwk.png


Краткий каталог курсов

Data Science и Machine Learning

Python, веб-разработка

Мобильная разработка

Java и C#

От основ — в глубину

А также


© Habrahabr.ru