Что нового в Go 1.18
Обобщения, тестовый фаззинг, оптимизация для AMD64, режим рабочей области и многое другое
Это снова то время года: новый релиз Go не за горами. Команда Go только что сделала доступным Go 1.18 Release Candidate 1 (go1.18rc1) с ожиданием выпуска Go 1.18 к концу февраля 2022 года.
Go 1.18 — один из самых ожидаемых выпусков Go за долгое время, и на то есть веские причины. Go 1.18 реализует первоначальную поддержку универсальных типов и функций, которая является наиболее востребованной и, возможно, наиболее обсуждаемой функцией в сообществе Go.
В дополнение к Generics, Go 1.18 включает в себя множество других замечательных функций, таких как поддержка тестирования фаззинга, поддержка микроархитектуры и оптимизация для процессоров AMD64, изменения в инструменте go
, включая поддержку режима «рабочей области», несколько обновлений основных библиотек и множество исправлений ошибок и незначительных обновлений стандартной библиотеки.
Давайте взглянем на некоторые из основных обновлений.
Поддержка дженериков
Generics — самая ожидаемая функция в этом выпуске. Go 1.18 поддерживает первоначальную реализацию универсальных типов и функций в соответствии с Предложением универсальных методов. Благодаря этому новому дополнению язык поддерживает объявление параметризованных типов и функций, которые впоследствии могут быть созданы с различными типами аргументов.
Использование универсальных шаблонов улучшает общее повторное использование кода, позволяя объединять наборы функций или типов, которые имеют аналогичную реализацию, но работают с разными типами ввода, в отдельные объекты, которые легче тестировать и поддерживать.
Например, для некоторых библиотек обычно используется код, подобный этому:
func SumInt(a, b int) int { return a + b } func SumFloat32(a, b float32) float32 { return a + b } func SumFloat64(a, b float64) float64 { return a + b } //func sum...
Используя универсальную функцию, вы можете объединить все эти функции в одну функцию:
func Sum[T constraints.Ordered] (a, b T) T { return a + b }
Поскольку это серьезное изменение языка и совершенно новая функция, существуют некоторые ограничения, потенциальное влияние на производительность и, возможно, неизвестные проблемы. Помните об этих неопределенностях при развертывании универсального кода в рабочей среде.
Для получения дополнительной информации о дженериках ознакомьтесь с примечаниями к выпуску и обновленной спецификацией языка.
Тестовый фаззинг
Еще одно долгожданное дополнение к Go 1.18 — поддержка тестового фаззинга. Фаззинг — это стратегия тестирования программного обеспечения, которая включает в себя предоставление большого количества случайных входных параметров, включая множество пограничных случаев, для тестируемого кода с целью отлова ошибок, выявления ошибок, запуска исключений и обнаружения уязвимостей, которые в противном случае трудно обнаружить. людей для обнаружения.
Фаззинг тестов Go добавляет новый тип в пакет testing
testing.F
и расширяет текущие функции и стратегии Go, такие как тестирование на основе таблиц. До этого выпуска вы могли использовать внешние библиотеки для выполнения тестового фаззинга, но добавление фаззинга к стандартным инструментам обеспечит лучшую поддержку и облегчит доступ большему количеству разработчиков.
🌟 Имейте в виду — команда Go предупреждает нас, что текущая реализация фаззинга использует много системных ресурсов и может повлиять на производительность вашей системы во время выполнения.
Дополнительные сведения см. в Документации по Go Fuzzing.
Оптимизация микроархитектуры для процессоров AMD64
Go 1.18 представляет оптимизацию микроархитектуры для процессоров AMD64. Теперь вы можете использовать новую переменную среды Go GOAMD64
, чтобы выбрать одну из четырех целей микроархитектуры v1
, v2
, v3
или v4
, чтобы указать компилятору оптимизировать полученный двоичный файл для конкретных функций ЦП. Это приводит к оптимизированным двоичным инструкциям, которые несовместимы с процессорами, не имеющими этих функций.
Значение по умолчанию для переменной GOAMD64=v1
приводит к двоичным инструкциям, совместимым со всеми 64-разрядными процессорами x86.
Подробнее об этой функции см. в разделе Архитектура на странице минимальных требований.
Перейти в режим рабочей области
Наконец, для последнего выделенного обновления Go 1.18 представляет новый режим рабочей области с поддержкой команды go
, которая позволяет работать с несколькими модулями одновременно. Раньше работа с несколькими модулями была непростой и могла вызвать проблемы с инструментами и IDE. Эта новая функция решает эти проблемы, внося изменения в другие инструменты, такие как gopls
, для упрощения работы с несколькими модулями.
С этим изменением, если команда или инструмент go
находит файл с именем go.work
в текущем или родительском каталоге, он будет работать в режиме с учетом рабочей области. Затем он использует содержимое этого файла, чтобы определить, какие модули следует использовать для разрешения зависимостей вместо использования файла go.mod
.
В Go 1.18 вы можете использовать команду go work
для создания и управления go.work
файлами. Для получения дополнительной информации обратитесь к его документации.
Более подробное объяснение функции рабочей области и краткое изложение многих других улучшений Go 1.18 см. в эпизоде 217 подкаста Go Time.
Что дальше?
Эта статья представляет собой краткий обзор основных обновлений, которые появятся в Go 1.18, но есть много дополнительных исправлений ошибок и незначительных улучшений инструментов, компилятора и стандартной библиотеки. Полный список см. в Примечаниях к выпуску Go 1.18.
Если вы не можете дождаться финального релиза через пару недель и хотите начать тестирование Go 1.18 прямо сейчас, не устанавливая его на свой компьютер, посетите Go Playground и выберите Go Dev Branch. в раскрывающемся списке Перейти к выпуску. Вы также можете запустить его как контейнер с помощью Podman или Docker.
Если вы предпочитаете, чтобы он был установлен на вашем компьютере, чтобы вы могли протестировать часть своего кода, загрузите Go 1.18 RC1 на свой локальный компьютер, следуя инструкциям на странице загрузки.
Если вам понравилась эта статья, вам также может понравиться книга Рикардо, опубликованная The Pragmatic Bookshelf:
Напишите свои собственные быстрые, надежные и кроссплатформенные инструменты командной строки с помощью языка программирования Go.