После шести месяцев разработки увидел свет релиз языка программирования 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), позволяющей учитывать особенности, определяемые во время выполнения программы.