Интересные изменения в Golang 1.21
Golang 1.21 это новая версия языка программирования Go, которая была выпущена 15 октября 2023 года. В этой версии были внесены некоторые изменения в язык, инструменты и библиотеки.
В язык были добавлены три новых встроенных функции: min, max и clear. Функции min и max вычисляют наименьшее (или наибольшее, для max) значение из фиксированного числа аргументов. Функция clear удаляет все элементы из карты или обнуляет все элементы среза. Подробнее см. спецификацию языка.
Порядок инициализации пакетов теперь определен более точно. Новый алгоритм таков: отсортировать все пакеты по пути импорта, повторять до тех пор, пока список пакетов не станет пустым: найти первый пакет в списке, для которого все импорты уже инициализированы, инициализировать этот пакет и удалить его из списка. Это может изменить поведение некоторых программ, которые полагаются на конкретный порядок инициализации, который не был выражен явными импортами. Поведение таких программ не было хорошо определено спецификацией в прошлых релизах. Новое правило обеспечивает однозначное определение.
Было сделано несколько улучшений, которые повышают мощность и точность вывода типов. Теперь (возможно частично инстанцированная обобщенная) функция может быть вызвана с аргументами, которые сами являются (возможно частично инстанцированными) обобщенными функциями. Компилятор будет пытаться вывести отсутствующие типовые аргументы вызываемой функции (как и раньше) и, для каждого аргумента, который является обобщенной функцией, которая не полностью инстанцирована, ее отсутствующие типовые аргументы (новое). Типичные случаи использования - это вызовы обобщенных функций, работающих с контейнерами (например, slices.IndexFunc), где функциональный аргумент также может быть обобщенным, и где типовой аргумент вызываемой функции и ее аргументов выводится из типа контейнера.
В инструментах были сделаны различные улучшения производительности и исправления ошибок. Например: go build теперь поддерживает флаг -trimpath для удаления всей информации о файловой системе из скомпилированных исполняемых файлов; go vet теперь проверяет корректность использования R15 при динамической компоновке на amd64; go mod tidy теперь удаляет неиспользуемые замены из go.mod.
В библиотеках были добавлены новые пакеты и улучшены существующие. Например: был добавлен новый пакет log/slog для структурированного логирования; был добавлен новый пакет testing/slogtest для поддержки тестирования кода, использующего log/slog; был добавлен новый пакет slices для работы со срезами любого типа; был добавлен новый пакет maps для работы с картами любого типа; был добавлен новый пакет cmp для сравнения значений разных типов.
Интересные факты и фичи языков программирования у нас в канале, заходи :)