![](https://habrastorage.org/webt/t-/vp/v1/t-vpv1gobsgq680xjeufqihdr0m.png)
Состоялся релиз языка программирования Go 1.22. Этот проект развивает компания Google при участии сообщества как гибридное решение, сочетающее высокую производительность компилируемых языков с такими достоинствами скриптовых языков, как лёгкость написания кода, быстрота разработки и защищённость от ошибок. Исходный код языка Go распространяется под открытой лицензией BSD.
Согласно данным портала OpenNET, синтаксис Go основан на привычных элементах языка C, включая отдельные заимствования из языка «Оберон». Язык Go достаточно лаконичен, но при этом код легко читается и воспринимается. Код на языке Go компилируется в обособленные бинарные исполняемые файлы, выполняемые нативно, без использования виртуальной машины (модули профилирования, отладки и другие подсистемы выявления проблем на этапе выполнения интегрируются в виде runtime-компонентов), что позволяет добиться производительности, сопоставимой с программами на языке C.
Проект изначально разрабатывается с оглядкой на многопоточное программирование и эффективную работу на многоядерных системах, в том числе предоставляя реализованные на уровне операторов средства для организации параллельных вычислений и взаимодействия между параллельно выполняемыми методами. Язык также предоставляет встроенные средства защиты от выхода за допустимые области выделенных блоков памяти и обеспечивает возможность использования сборщика мусора.
Основные изменения и доработки в выпуске Go 1.22:
в циклы for добавлена поддержка определения диапазонов из целых чисел, например, для перебора значений с 0 до 9 теперь можно использовать цикл "for i := range 10 {...}";
в циклы for добавлена экспериментальная (GOEXPERIMENT=rangefunc) поддержка функций определения диапазона, позволяющая указывать функцию в качестве итератора. Например, "for i, x := range slices.Backward(s) {...};
решена давняя проблема с циклами "for", приводившая при вызове сопрограмм (goroutine) к совместному использованию переменных цикла в разных итерациях;
проведена оптимизация работы с памятью в 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).