Go 1.21, gonew и lego
В этом выпуске рассказываем про нововведения в языке Go, экспериментальную утилиту gonew, позволяющую создавать проект из шаблона, и альтернативную реализацию клиента Certbot.
Вышел Go 1.21
Не успели мы опомниться, а с момента выхода версии 1.20 прошло уже полгода. Пора смотреть, что нового в Go 1.21. Большинство изменений затронуло библиотеки, рантайм и инструментарий. Отдельное внимание разработчики уделили своему обещанию соблюдать обратную совместимость: приложения, созданные в соответствие со спецификацией первой версии языка, будут правильно компилироваться и работать в новых версиях.
В Go 1.21 появилось три новых фичи. Первая добавляет функции min и max, вычисляющие наименьшее и наибольшее значение фиксированного числа аргументов упорядоченного типа. Гораздо проще объяснить, как это работает, на примере кода:
var x, y int
m := min(x) // m == x
m := min(x, y) // m is the smaller of x and y
m := max(x, y, 10) // m is the larger of x and y but at least 10
c := max(1, 2.0, 10) // c == 10.0 (floating-point kind)
f := max(0, float32(x)) // type of f is float32
var s []string
_ = min(s...) // invalid: slice arguments are not permitted
t := max("", "foo", "bar") // t == "foo" (string kind)
Вторая фича добавила универсальный «ластик», функцию clear. Она отлично справляется с двумя вещами: стирает всё содержимое из ассоциативных массивов (карт) или обнуляет все элементы среза. Учтите, что если карта или срез nil, то clear не работает.
Третья фича — изменённый алгоритм инициализации пакетов. Теперь процесс инициализации сортирует все пакеты по пути импорта и итеративно повторяет это действие, пока список пакетов не опустеет. Вначале система находит первый пакет, для которого импорты инициализирован, затем инициализирует его и удаляет из списка. Учтите, что это может повлиять на поведение некоторых приложений, которые полагаются на определённый порядок инициализации.
Помимо вышеперечисленного, функции теперь можно вызывать с аргументами, которые сами являются универсальными функциями. Так что теперь использовать универсальные функции можно без явного создания экземпляра, когда функция присваивается переменной (или возвращается в качестве значения результата).
Это наиболее важные изменения релиза. Чтобы узнать подробности и ознакомиться с полным списком изменений, рекомендует прочитать примечания к выпуску Go 1.21.
Приложения из шаблонов
Любой писатель, хотя бы раз в жизни, сталкивался со страхом чистого листа. Открываешь текстовый редактор, заносишь руки над клавиатурой… и пустота. Ни мыслей, ни идей. Разработчики тоже довольно часто испытывают нечто подобное, когда создают новый проект.
Конечно, можно начать с клонирования уже существующего проекта, но это не всегда наилучший способ приступить к работе. Чтобы решить эту проблему, можно обратиться к опыту всё тех же писателей. Если им раз за разом приходится создавать документы со схожей структурой, то для простоты они создают шаблоны документов. Эта фича есть во всех профессиональных текстовых редакторах. Так что вместо пустой страницы писатель видит уже готовый шаблон, что облегчает старт.
Создание нового проекта приложения и создание нового документа концептуально не имеет отличий, так что использование шаблонов — отличный способ справиться с ситуацией. Поэтому был опубликован экспериментальный инструмент gonew, позволяющий создавать проекты Go из заранее подготовленных шаблонов. Любой программист может создать такой шаблон, упаковать в виде модуля и сохранить для личного пользования или выложить в открытый доступ.
Сразу оговоримся, что это пока только прототип, имеющий минимальную функциональность. Пощупать его своими руками можно после установки:
$ go install golang.org/x/tools/cmd/gonew@latest
В качестве шаблона можно взять заранее подготовленный пример. В целом, создать собственный шаблон ничем не сложнее, чем создать любой другой модуль в Go.
Чтобы создать проект по заданному шаблону достаточно вызвать gonew с двумя аргументами: путь к шаблону и имя модуля создаваемого проекта:
$ gonew golang.org/x/example/helloserver example.com/myserver
$ cd ./myserver
Разработчики просят сообщать обо всех найденных ошибках, чтобы сделать работу gonew лучше и удобнее.
Конструктор LeGo
На Go делается много крутых и интересных приложений. Одно из них, библиотека lego, выполняющее сразу две полезных функции: ACME (Automatic Certificate Management Environment) библиотека и удобный клиент для сервиса Let’s Encrypt. Он полностью написан на Go и распространяется в виде исходников, предварительно скомпилированных пакетов и в виде Docker-контейнера.
Краткая справка от Капитана Очевидность про Let’s Encrypt. Эта компания взяла на себя благородную миссию сделать современный интернет более защищённым и стала выдавать бесплатные TLS-сертификаты для сайтов. Имея такой сертификат, выпущенный центром сертификации Let’s Encrypt, для любого веб-сайта можно включить защищённый HTTPS-протокол и получить заветный символ закрытого замка в адресной строке.
Это означает, что даже если трафик между узлами будет перехвачен злоумышленниками, то использовать они его не смогут. Весь передаваемый трафик шифруется криптографическими ключами, взлом которых, даже на современном железе, займёт тысячи лет. Звучит здорово, но теперь поговорим об ограничениях. Поскольку Let’s Encrypt бесплатен, сертификаты выдаются на ограниченное количество времени (90 дней). Если сертификат истёк, то его нужно перевыпустить.
Для работы с Let’s Encrypt был разработан клиент Certbot. С помощью него можно полностью контролировать процесс выпуска и перевыпуска сертификатов. Его активно применяют для автоматизации процесса, чтобы админам не приходилось вручную обновлять сертификаты каждые 90 дней. Certbot представляет собой реализацию ACME протокола, упомянутого выше. Альтернатив достаточно много, список доступен на сайте проекта.
Основное, чем lego интересен для Go-разработчиков, это избавление от костылей в виде самодельной реализации ACME-протокола. Вся эта сложная работа уже была проделана за вас. Так что в вашем приложении может быть заложена функциональность работы с любыми центрами сертификации, поддерживающими этот протокол. Да и просто почитать код таких приложений полезно, там есть на что взглянуть.
Митапы
Go meetup
8 ноября 2023
Осенью у нас запланирован Go Meetup. Программа мероприятия формируется, но регистрация уже открыта. Кстати, вы уже можете подать доклад прямо в режиме онлайн. Заявки на участие спикера принимаются до 15 октября.
Интересуетесь нашими мероприятиями? В Telegram-канале Evrone meetups мы выкладываем анонсы с подробными описаниями докладов, а также студийные записи прошедших митапов. Тем для кого выступать в новинку, мы оказываем всяческую поддержку и помогаем оформить экспертизу в яркое выступление. Подписывайтесь и пишите @andrew_aquariuss, чтобы узнать подробности.
Вакансии
Удаленка / Офис
Evrone
Мы открыты для новых Go-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.