Произошло знаменательное событие. В феврале 2024 года Go вошел в десятку популярных языков программирования рейтинга Tiobe. Это первый случай в истории языка, когда он занимает столь высокую позицию. А именно восьмую строчку.
Ссылка на рейтинг
В сообществе есть разные мнения по поводу объективности этого рейтинга. Все же он отражает некоторую степень востребованности языка на рынке.
Чтобы отметить такое событие, предлагаю в этой короткой статье посмотреть на интересные изменения, которые были добавлены в версии 1.22.
Версия 1.22
С новыми функциями вы уже можете ознакомиться, установив последнюю версию Go или в онлайн — песочнице.
Начнем с самого простого и изящного.
Итерация по числовому ряду
Добавлен новый вариант цикла for range, в котором можно указать число. В переменную цикла, будут сохраняться значения, начиная с 0 и до указанного числа не включительно.
Если значение будет отрицательное, то цикл не запустится вообще.
Для сравнения приведем два варианта — старый и новый.
Получаем идентичный результат, но с экономией набора символов.
Улучшение цикла for
Второе значимое улучшение связано с проблемой цикла for.
До версии 1.22 на каждой итерации цикла, переменная цикла инициализировалась только один раз. Если распечатать адрес этой переменной, то он будет неизменным в блоке видимости конструкции цикла.
Это было сделано для экономии вычислений и выделения памяти.
Давайте посмотрим на примере:
Обратите внимание, что адрес переменной в цикле один и тот же.
В версии 1.22 адрес переменной в цикле меняется.
Это важное изменение избавляет от части проблем, связанных с замыканиями и горутинами.
В предыдущих версиях Go следующий код работал не совсем так, как может ожидать разработчик.
Видим что, функции fmt.Print(i) выводит одно и то же значение. Если не учитывать это, такое поведение приводит к серьезным ошибкам в логике программы. Линтер go vet предупреждает, что переменная цикла захватывается функцией, что может приводить к тяжелым последствиям при эксплуатации многопоточных программ.
В новой версии ситуация кардинально меняется.
Теперь такой код корректно выдает все числа от 0 до 9, а не только последнее значение переменной i.
Функция Concat для срезов
Теперь срезы можно складывать с помощью функции Concat. Она добавлена в пакет slices.
В примере мы складываем два среза [1, 2] и [3, 4] и ожидаемо получаем один срез из четырех элементов: [1, 2, 3, 4]
Оптимизация производительности
С каждой новой версией Go разработчики языка трудятся над улучшением производительности.
В новой версии среда выполнения (runtime) была улучшена на 1-3 процента в части управления памятью, также снизив расход памяти примерно на 1%.
Почетное упоминание
Достойны упоминания следующие нововведения:
1) Добавлен пакет math/rand/v2
В нем значительно переработан API пакета для генерации псевдослучайных последовательностей.
2) http.ServeMux теперь поддерживает wildcards и помогает создавать параметризованные функции обработки в веб-приложениях.
Эти новшества мы рассмотрим в дальнейших материалах.
Оффтоп
Если только начинаешь изучать язык Go, почитай серию уроков по основам:
Также у меня есть платный курс на платформе Stepik, который способен закрыть все потребности для подготовки к собеседованию по Go. Он подходит и для начинающих разработчиков.
Продуктивности и добра.