Go 1.20 выиграл от продления фазы разработки, что стало возможным благодаря более раннему широкому тестированию и повышению общей стабильности кодовой базы.
Мы особенно рады представить предварительную версию оптимизации, управляемой профилем (PGO), которая позволяет компилятору выполнять оптимизацию для конкретных приложений и рабочих нагрузок на основе информации о профиле во время выполнения. Предоставление профиля для сборки позволяет компилятору ускорить типичные приложения примерно на 3-4%, и мы ожидаем, что будущие выпуски получат еще больше преимуществ от PGO.
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании! 😎
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
Поскольку это предварительный выпуск поддержки 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!
Администрирую данный сайт с целью распространения как можно большего объема обучающего материала для языка программирования Go. В IT с 2008 года, с тех пор изучаю и применяю интересующие меня технологии. Проявляю огромный интерес к машинному обучению и анализу данных.
E-mail: vasile.buldumac@ati.utm.md
Образование
Технический Университет Молдовы (utm.md), Факультет Вычислительной Техники, Информатики и Микроэлектроники
- 2014 — 2018 Universitatea Tehnică a Moldovei, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Universitatea Tehnică a Moldovei, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»