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

Мы особенно рады представить предварительную версию оптимизации, управляемой профилем (PGO), которая позволяет компилятору выполнять оптимизацию для конкретных приложений и рабочих нагрузок на основе информации о профиле во время выполнения. Предоставление профиля для сборки позволяет компилятору ускорить типичные приложения примерно на 3-4%, и мы ожидаем, что будущие выпуски получат еще больше преимуществ от PGO.

Премиум 👑 канал по Golang

Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎

Подписаться на канал

Уроки, статьи и Видео

Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.

Go в ВК ЧАТ в Telegram


Поскольку это предварительный выпуск поддержки PGO, мы призываем всех опробовать ее, но есть еще неровности, которые могут помешать использованию в производстве.

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

Улучшенная производительность

  • Усовершенствования компилятора и сборщика мусора позволили снизить затраты памяти и повысить общую производительность процессора на 2%.
  • Работа, направленная непосредственно на время компиляции, привела к улучшению сборки на 10%. Это вернуло скорость сборки в соответствие с Go 1.17.

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

  • Ограничение предопределенной сравнимости теперь выполняется и обычными сравнимыми типами, такими как интерфейсы, что упростит общий код.
  • Функции SliceData, String и StringData были добавлены в пакет unsafe. Они дополняют набор функций для независимого от реализации манипулирования срезами и строками.
  • Правила преобразования типов в Go были расширены, чтобы разрешить прямое преобразование из среза в массив.
  • Спецификация языка теперь определяет точный порядок, в котором сравниваются элементы массивов и поля struct. Это разъясняет, что происходит в случае паники во время сравнения.

Усовершенствования инструментов

  • Инструмент cover теперь может собирать профили покрытия целых программ, а не только юнит-тестов.
  • Инструмент go больше не полагается на предварительно скомпилированные архивы пакетов стандартной библиотеки в каталоге $GOROOT/pkg, и они больше не поставляются вместе с дистрибутивом, что приводит к уменьшению объема загружаемых файлов. Вместо этого пакеты стандартной библиотеки собираются по мере необходимости и кэшируются в кэше сборки, как и другие пакеты.
  • Реализация go test -json была улучшена, чтобы сделать ее более надежной при наличии случайных записей в stdout.
  • Команды go build, go install и другие команды, связанные со сборкой, теперь принимают флаг -pgo, позволяющий оптимизировать с учетом профиля, а также флаг -cover для анализа покрытия всей программы.
  • Команда go теперь отключает cgo по умолчанию на системах без инструментария C. Следовательно, когда Go устанавливается на систему без компилятора C, он теперь будет использовать чистые сборки Go для пакетов в стандартной библиотеке, которые опционально используют cgo, вместо использования предварительно распространяемых архивов пакетов (которые были удалены, как отмечалось выше).
  • Инструмент vet сообщает о большем количестве ошибок ссылок на переменные цикла, которые могут возникать в параллельно выполняющихся тестах.

Дополнения к стандартной библиотеке

  • Новый пакет crypto/ecdh обеспечивает явную поддержку обмена ключами Elliptic Curve Diffie-Hellman по кривым NIST и Curve25519.
  • Новая функция errors.Join возвращает ошибку, обернув список ошибок, которые могут быть получены снова, если тип ошибки реализует метод Unwrap() []error.
  • Новый тип http.ResponseController предоставляет доступ к расширенной функциональности по запросам, не обрабатываемой интерфейсом http.ResponseWriter.
  • Пакет httputil.ReverseProxy включает новую функцию Rewrite, заменяющую предыдущую Director.
  • Новая функция context.WithCancelCause предоставляет возможность отменить контекст с заданной ошибкой. Эту ошибку можно получить, вызвав новую функцию context.Cause.
  • Новые поля в os/exec.Cmd: Cancel и WaitDelay определяют поведение Cmd при отмене связанного с ним контекста или завершении процесса.

При сборке релиза Go из исходного кода, Go 1.20 требует наличия релиза Go 1.17.13 или более нового. В будущем мы планируем переносить инструментарий bootstrap примерно раз в год.

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

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

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

Наслаждайтесь Go 1.20!