Представлен релиз языка программирования Go 1.21, который развивается компанией Google при участии сообщества как гибридное решение, сочетающее высокую производительность компилируемых языков с такими достоинствами скриптовых языков, как лёгкость написания кода, быстрота разработки и защищённость от ошибок. Код проекта распространяется под лицензией BSD.
Синтаксис Go основан на привычных элементах языка Си с отдельными заимствованиями из языка Оберон. Язык достаточно лаконичен, но при этом код легко читается и воспринимается. Код на языке Go компилируется в обособленные бинарные исполняемые файлы, выполняемые нативно, без использования виртуальной машины (модули профилирования, отладки и другие подсистемы выявления проблем на этапе выполнения интегрируются в виде runtime-компонентов), что позволяет добиться производительности, сопоставимой с программами на языке Си.
Проект изначально разрабатывается с оглядкой на многопоточное программирование и эффективную работу на многоядерных системах, в том числе предоставляя реализованные на уровне операторов средства для организации параллельных вычислений и взаимодействия между параллельно выполняемыми методами. Язык также предоставляет встроенные средства защиты от выхода за допустимые области выделенных блоков памяти и обеспечивает возможность использования сборщика мусора.
Среди изменений в новом выпуске:
- Реализована поддержка оптимизаций на основе результатов профилирования кода (PGO – Profile-guided optimization), учитывающих особенности, определяемые во время выполнения программы. Учёт профиля выполнения при сборке позволяет повысить производительность приложений на 2-7%. Оптимизации автоматически включаются при наличии файла default.pgo во время сборки, подготовленного утилитой pprof. Для выбора другого профиля предусмотрена опция “-pgo”.
- В утилите go обеспечена прямая и обратная совместимость с другими версиями языка Go, что позволяет использовать старый инструментарий для сборки нового кода и наоборот.
- Добавлены встроенные функции min и max для выбора наименьшего/наибольшего значения, а также функция clear для удаления или обнуления всех элементов в структурах map или slice.
- Улучшен вывод типов в обобщённых функциях (дженериках), предназначенных для работы сразу с несколькими типами.
- Добавлена экспериментальная поддержка новой семантики обработки переменных в циклах, позволяющей избежать типовых ошибок из-за специфичного поведения при использовании замыканий и сопрограмм в итерациях. Новая семантика подразумевает создание для каждой итерации цикла отдельного экземпляра переменной, объявленной в цикле “for” при помощи оператора “:=”.
- В стандартную библиотеку добавлены новые пакеты:
- log/slog – функции для записи структурированных логов.
- slices – типовые операции со срезами (slice) любых типов. Например, предложены функции для сортировки, более быстрые и гибкие, чем функции из пакета sort.
- maps – полезные операции над отображениями (map) с любыми типами ключей и элементов.
- cmp – функции для сравнений упорядоченных значений.
- Компилятор пересобран с включением PGO-оптимизаций, что позволило ускорить сборку программ на 2-4%.
- Проведена оптимизация сборщика мусора, позволившая до 40% уменьшить задержки в некоторых приложениях.
- Снижены накладные расходы при трассировке кода при помощи пакета runtime/trace на системах с архитектурой amd64 и arm64.
- Реализован экспериментальный порт (GOOS=wasip1, GOARCH=wasm) для компиляции в промежуточный код WebAssembly, использующий API WASI (WebAssembly System Interface) для обеспечения обособленного запуска.