Выпуск языка программирования Go 1.22

Представлен релиз языка программирования 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 <- true
               }()
          }
    

    теперь будет выводить «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).



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

© OpenNet