Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала модулей Go

Представлен релиз языка программирования Go 1.20, который развивается компанией Google при участии сообщества как гибридное решение, сочетающее высокую производительность компилируемых языков с такими достоинствами скриптовых языков, как лёгкость написания кода, быстрота разработки и защищённость от ошибок. Код проекта распространяется под лицензией BSD.

Синтаксис Go основан на привычных элементах языка Си с отдельными заимствованиями из языка Python. Язык достаточно лаконичен, но при этом код легко читается и воспринимается. Код на языке Go компилируется в обособленные бинарные исполняемые файлы, выполняемые нативно, без использования виртуальной машины (модули профилирования, отладки и другие подсистемы выявления проблем на этапе выполнения интегрируются в виде runtime-компонентов), что позволяет добиться производительности, сопоставимой с программами на языке Си.

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

Среди изменений в новом выпуске:

  • Предоставлена экспериментальная поддержка оптимизации на основе результатов профилирования кода (PGO — Profile-guided optimization), позволяющей учитывать особенности, определяемые во время выполнения программы. Учёт профиля выполнения при сборке позволяет повысить производительность приложения на 3-4%. Для включения PGO в go build, go install и другие сборочные команды добавлена опция «-pgo».
  • В пакет unsafe добавлены функции SliceData, String и StringData для низкоуровневых манипуляций со срезами (массивы фиксированной длины) и строками (например, преобразования области памяти, на которую ссылается указатель в строку с типом string и наоборот).
  • Правила преобразования типов расширены возможностью прямого преобразования из среза (slice) в массив.
  • В спецификации явно определён порядок сравнения элементов массива и полей структур.
  • Утилита cover расширена возможностью построения coverage-профиля для всей программы, а не только unit-тестов. Для формирования coverage-профиля в go build, go install и другие сборочные команды добавлена опция «-cover».
  • Утилита go избавлена от привязки к размещаемым в каталоге $GOROOT/pkg заранее скомпилированным пакетам стандартной библиотеки, что позволило исключить их из поставки и добиться уменьшения размера загружаемых данных. Пакеты стандартной библиотеки, как и обычные пакеты, теперь собираются по мере необходимости и кэшируются в сборочном кэше.
  • В команде go по умолчанию отключено применение пакета cgo на системах без инструментария для сборки кода на языке Си. На подобных системах теперь используются варианты пакетов стандартной библиотеки на языке Go, вместо использования предварительно скомпилированных пакетов.
  • В утилите vet реализованы дополнительные предупреждения о проблемах с используемыми в циклах переменными, выявленными при параллельном запуске тестов.
  • В стандартную библиотеку добавлен пакет crypto/ecdh с поддержкой обмена ключами на основе эллиптических кривых ECDH (Elliptic Curve Diffie-Hellmann).
  • Добавлен новый тип http.ResponseController для создания расширенных обработчиков HTTP-ответов.
  • В тип httputil.ReverseProxy добавлена функция Rewrite для изменения запроса.
  • Добавлена функция context.WithCancelCause, позволяющая отменить вызов с указанием отпределённой ошибки.
  • В тип os/exec.Cmd добавлены поля Cancel и WaitDelay, определяющие поведение при отмене контекста или завершении процесса.
  • В компиляторе и сборщике мусора снижено потребление памяти и проведена оптимизация производительности (прирост скорости достигает 2%).
  • Проведена работа по ускорению компиляции — сокращение времени сборки может достигать 10%.
  • Добавлена экспериментальная поддержка платформы FreeBSD на системах с арихитектурой RISC-V (GOOS=freebsd, GOARCH=riscv64).

Дополнительно можно отметить урегулирование проблем у платформы совместной разработки SourceHut с сервисом Go Module Mirror. Из-за слишком большой нагрузки, возникающей при импорте размещаемых в репозиториях SourceHut модулей на языке Go, ранее было решено начиная с 24 февраля запретить доступ к git-репозиториям через Go Module Mirror (proxy.golang.org). Разработчики проекта Go урегулировали проблему отключив автоматическое обновление с
proxy.golang.org для хостов SourceHut и предложив для утилиты go новый флаг «-reuse» для ручного управления обновлением. После предложенного решения трафик на SourceHut с proxy.golang.org снизился до разумных пределов и команда SourceHut отменила планируемую блокировку Go Module Mirror.

Проблема была связана с тем, что при выполнении команд, таких как «go get», импорт модулей из внешних репозиториев осуществляется не напрямую, а через кэширующий прокси proxy.golang.org, который периодически загружает содержимое репозитория (выполняет git clone) для проверки появления обновлений. Подобные загрузки выполняются независимо от выполнения пользователями «go get» и создают большую нагрузку на серверы (фиксируется примерно 2500 операций git clone в час для всего хостинга и до 100 запросов в час для отдельных git-репозиториев, при том что часть запросов поступает одновременно).

Источник: http://www.opennet.ru/opennews/art.shtml?num=58586