Выпуск языка программирования Go 1.23 с поддержкой телеметрии

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

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

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

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

  • В циклах «for» при определении диапазонов значений появилась возможность указания функции в качестве аргумента выражения «range» для использования этой функции в качестве итератора, что позволяет создавать собственные итераторы для любых последовательностей. Возможно указание функций следующих типов: func(func() bool), func(func(K) bool) и func(func(K, V) bool). Добавлен новый пакет iter, предоставляющий базовые операции для организации перебора последовательностей. Кроме того, в пакеты slices и maps добавлены новые возможности для работы с итераторами. Например, для перебора ключей ассоциативного массива в отсортированном виде теперь можно указать «for i, x := range slices.Sorted(maps.Keys(m)) {…}».
  • Добавлена предварительная поддержка (включается через GOEXPERIMENT=aliastypeparams) использования псевдонимов типов со своими параметрами в обобщённых функциях (дженериках), при помощи которых можно создавать функции для работы сразу с несколькими типами.
  • В инструментарий встроена возможность отправки телеметрии на сервер telemetry.go.dev.
    Телеметрия сохраняется в локальных файлах, доступных для аудита, и охватывает только данные об особенностях работы с инструментарием (телеметрия не добавляется в пользовательские приложения, собираемые при помощи инструментария). По умолчанию отправка телеметрии на внешний сервер отключена (opt-in) и требует активации при помощи новой команды «go telemetry on». Отправка телеметрии поможет выявить аномалии и нештатное поведение, оценить особенности взаимодействия разработчиков с инструментарием и понять, какие опции наиболее востребованы, а какие почти не используются. Предполагается, что накопленная статистика даст возможность модернизировать инструментарий, позволит повысить эффективность и удобство работы.

  • Добавлена команда «go env -changed» для вывода только настроек, значения которых отличаются от значений по умолчанию.
  • Добавлена команда «go mod tidy -diff», позволяющая вместо внесения изменений в файлы, вывести изменения в форме патча в формате diff.
  • В команду «go vet» добавлен анализатор версий, показывающий элементы, слишком новые для использования в выбранной версии Go.
    Например, анализатор выдаст предупреждение об использовании функции reflect.TypeFor, появившейся в версии 1.22, при попытке использования в модуле, заявляющем поддержку версии 1.21.

  • Улучшена реализация типов time.Timer и time.Ticker, в которые внесены изменения связанные с буферизацией и оптимизацией сборки мусора.
  • Добавлен пакет structs, определяющий типы для изменения свойств структуры.
  • Добавлен пакет unique с функциями для канонизации сопоставимых значений.
  • В файлы go.mod и go.work добавлена поддержка директивы godebug для управления отладкой.
  • Добавлена экспериментальная поддержка OpenBSD на 64-разрядных системах RISC-V (openbsd/riscv64). Улучшена поддержка Linux, macOS, ARM64, RISC-V и WASI.
  • Повышена производительность на архитектурах i386 и amd64 при включении оптимизации на основе результатов профилирования кода (PGO — Profile-guided optimization), позволяющей учитывать особенности, определяемые во время выполнения программы.

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