Представлен релиз языка программирования Go 1.22, который развивается компанией Google при участии сообщества как гибридное решение, сочетающее высокую производительность компилируемых языков с такими достоинствами скриптовых языков, как лёгкость написания кода, быстрота разработки и защищённость от ошибок. Код проекта распространяется под лицензией BSD.
Синтаксис Go основан на привычных элементах языка Си с отдельными заимствованиями из языка Оберон. Язык достаточно лаконичен, но при этом код легко читается и воспринимается. Код на языке Go компилируется в обособленные бинарные исполняемые файлы, выполняемые нативно, без использования виртуальной машины (модули профилирования, отладки и другие подсистемы выявления проблем на этапе выполнения интегрируются в виде runtime-компонентов), что позволяет добиться производительности, сопоставимой с программами на языке Си.
Проект изначально разрабатывается с оглядкой на многопоточное программирование и эффективную работу на многоядерных системах, в том числе предоставляя реализованные на уровне операторов средства для организации параллельных вычислений и взаимодействия между параллельно выполняемыми методами. Язык также предоставляет встроенные средства защиты от выхода за допустимые области выделенных блоков памяти и обеспечивает возможность использования сборщика мусора.
Среди изменений в новом выпуске:
- В циклы “for” добавлена поддержка определения диапазонов из целых чисел, например, для перебора значений с 0 до 9 теперь можно использовать цикл “for i := range 10 {…}”.
- В циклы “for” добавлена экспериментальная (GOEXPERIMENT=rangefunc) поддержка функций определения диапазона, позволяющая указывать функцию в качестве итератора. Например, “for i, x := range slices.Backward(s) {…}”
- Решена давняя проблема с циклами “for”, приводившая при вызове сопрограмм (goroutine) к совместному использованию переменных цикла в разных итерациях. Например, код values := []string{“a”, “b”, “c”} for _, v := range values { go func() { fmt.Println(v) done
теперь будет выводить “abc”, а не “ccc”, как было раньше. - Проведена оптимизация работы с памятью в runtime, которая привела к повышению производительности на 1-3% и снижению потребления памяти в большинстве приложений на 1%.
- Продолжена работа по задействованию в компиляторе оптимизаций на основе результатов профилирования кода (PGO – Profile-guided optimization), позволяющих учитывать особенности, определяемые во время выполнения программы. В новой версии в компиляторе задействованы средства девиртуализации для замены непрямых вызовов различных методов на выполнение развёрнутых inline-блоков. При включении PGO добавленное изменение позволило повысить производительность большинства программ на 2-14%.
- В компилятор добавлена экспериментальная (GOEXPERIMENT=newinliner) улучшенная реализация механизма развёртывания (inlining) вызовов, использующая эвристику для разделения важных и второстепенных операций.
- В стандартную библиотеку добавлен пакет “math/rand/v2“, в котором предложен более целостный API и задействованы более быстрые алгоритмы генерации псевдо-случайных чисел.
- В пакет net/http.ServeMux добавлена возможность указания методов и масок в шаблонах, например, шаблон “GET /static/{id}/” будет применён к запросам с HTTP-методом “GET” и сохранит значение второго сегмента запрошенного пути в идентификаторе “id”.
- В пакет database/sql добавлена поддержка типа Null[T], позволяющего сканировать столбцы, которые могут применать значение NULL.
- В пакет slices добавлена функция Concat для слияния нескольких слайсов любого типа.
- В командах для работы с рабочими пространствами (коллекциями модулей) предоставлена возможность использования каталога “vendor”, содержащего зависимости к содержимому рабочего пространства. Каталог создаётся при выполнении команды “go work vendor” и используется в сборочных командах при выставлении опции “-mod=vendor” (включает по умолчанию при наличии каталога vendor).