Обновление языка и телеметрия

14 февраля 2023
Обновление языка и телеметрия

Язык Go развивается, каждый новый релиз делает его лучше. Сегодня расскажем о важных изменениях, узнаем идею нового дизайна телеметрии для проектов с открытым исходным кодом и попробуем интегрировать данные из Go-приложения в HTML-шаблон.

Hurrah, Go 1.20 is released!

Версия 1.20, вышедшая 1 февраля 2023 года, принесла 4 ключевых изменения. Она расширила возможности конвертации из слайса в указатель массива. Так что, имея слайс x, конструкцию *(*[4]byte)(x) теперь можно записать значительно проще — [4]byte(x).

Встроенный в язык пакет unsafe, позволяющий выполнять низкоуровневые операции с памятью, пополнился тремя новыми функциями:

  • SliceData,
  • String,
  • StringData.

С помощью них можно конструировать и деконструировать слайсы и строковые значения без зависимости от их точного представления. При этом не стоит забывать об осторожности, ведь unsafe позволяет действовать почти без оглядки на ограничения языка. Всегда проверяйте код, чтобы не выстрелить себе в ногу.

Спецификация также подверглась некоторым изменениям. Раньше можно было неправильно понять, как сравниваются значения структур. Теперь там явно указано, что эти значения сравниваются по одному полю за раз. Порядок при этом соблюдается тот, в котором поля появлялись в определении типа структуры. Процесс останавливается при первом же найденном несоответствии.

Не забыли разработчики языка и об улучшении процесса сравнения. До выхода 1.20 правила сравнения были достаточно жёсткими. Они требовали явного соответствия по типу для корректной работы. Возьмём пример кода:

package main

import "fmt"

type mymap[K comparable, V any] map[K]V

func _[P any, Q comparable]() {
	var _ mymap[any, string] // не сработает в старых версиях до 1.20
}

func main() {
	fmt.Println("Hello, gophers!")
}

Если запустить его, например, в версии 1.19, то получим ошибку вида:

./prog.go:8:14: any does not implement comparable

Go build failed.

А вот в новой версии 1.20 функция отработает без каких-либо проблем. 

Смягчение правил даст возможность меньше думать про различия и задействовать данные, которые используют разные интерфейсы. Обратная сторона медали — в рантайме может оказаться, что какие-то типы сравнивать нельзя.

Дизайн прозрачной телеметрии

Практически любой разработчик знает этот замечательный момент. Работа над релизом завершена, софт отправился пользователям. Но как узнать, что всё работает как надо? Как понять, что не возникает каких-либо нежелательных эффектов? В этом случае простых отчётов об ошибках и пользовательских отзывов будет недостаточно. 

Даже незначительная разница между пользовательским устройством и средой, в которой разработчики выполняли тестирование, может стать причиной, по которой баг не был вовремя обнаружен. При масштабировании различия будут лишь увеличиваться. Без сбора и анализа телеметрии некоторые проблемы приложений выявить практически нереально.

Выбор телеметрии может быть сложным. Проекты с открытым исходным кодом предпочитают не собирать следы активности. Это помогает избежать необоснованных обвинений в сборе пользовательских данных. К тому же, собранные данные должны быть обезличены и их нужно где-то хранить. 

Конечно, можно предпочесть стратегию «do nothing», но это лишь приведёт к существенному недостатку знаний. Как результат — ошибочные решения, которые никак не соотносятся с реальными потребностями пользователей.

Но есть и примеры успешного внедрения традиционной телеметрии. Звуковой редактор Audacity, платформа GitLab и пакетный менеджер Homebrew для macOS не скрывают, что собирают телеметрию. Те, кто работает в Visual Studio Code также не слишком сильно переживают по этому поводу, если верить опросу 2022 года от StackOverflow. Возможно, это сыграло свою роль и сделало VSCode лучше.

Расс Кокс (Russ Cox) за свою 16-летнюю карьеру в Google сделал вывод, что телеметрия особенно важна для проектов с открытым исходным кодом. Это позволяет избежать ситуаций, при которых разработчик не знает, как используется его софт и насколько хорошо он работает. В то же время те, кто разрабатывает проприетарное программное обеспечение используют сбор телеметрии на полную катушку.

Если хирургу необходимо сделать операцию, то он старается минимизировать инвазивное вмешательство. Особенность нового дизайна прозрачной телеметрии, предложенной Рассом, базируется на том, чтобы собирать как можно меньше обезличенных данных. Если в цифрах, то это может быть 1 Кбайт в год с каждой установки. Полученные данные затем стоит делать доступными для публичного просмотра и анализа. Пока что всё это в процессе обсуждения с сообществом, но уже есть некоторые важные особенности.

Никаких псевдослучайных идентификаторов, IP-адресов или MAC-адресов. Разработчик может составить список значимых для него событий, а приложение будет вести учёт количества таких событий. В процессе отправки данных отчёт может включать интересующие значения счётчиков, версию ОС и архитектуру. Опционально могут быть добавлены данные о других инструментах, например версии локального компилятора.

Плюшевый гофер

Если вы хоть раз имели дело с Ruby, то знаете, что существует такой язык разметки, как eRuby. Эталонная реализация этого языка называется ERB и включена в стандартную библиотеку. С помощью ERB появляется возможность встраивать код на Ruby непосредственно в HTML-документ. Чтобы определить границы встраивания используются пары разделителей <% и %>. Таким образом, можно вычислять и подставлять значения сразу в HTML-шаблон. Можно ли провернуть такой трюк в Golang?

Посмотрите на механизм шаблонов Plush, входящий в состав фреймворка Buffalo. Его можно использовать в Go-приложениях отдельно от экосистемы Buffalo. Устанавливается Plush одной командой:

$ go get -u github.com/gobuffalo/plush

Синтаксис здесь очень похож на ERB. В частности, для динамического отображения содержимого используются разделители <%= и %>.

<!-- input -->
<p><%= "plush is great" %></p>

<!-- output -->
<p>plush is great</p>

Чтобы исполнить код, но не отображать его в шаблоне можно видоизменить разделители до <% и %>

<!-- input -->
<p><% "plush is great" %></p>

<!-- output -->
<p></p>

С помощью этих же тегов создаются переменные и функции внутри шаблонов для последующего использования. Вместе с этим можно добавлять комментарии, выстраивать циклы и многое другое. В итоге получаем отличную возможность рендеринга web-страниц с данными из Go-приложений.

Видеоподкаст про Go

Подкаст снимают и развивают двое наших коллег из Evrone. Они обсуждают его преимущества и недостатки, сравнивают с другими языками.

Выпуски длятся 50-70 минут, а значит можно совместить какие-нибудь скучные занятия с обучением. Отличная возможность погрузится в нюансы Go, стоя в пробке или проезжая очередную станцию метро!

Ну а если вам есть что сказать — добро пожаловать в комментарии!

Митапы

Онлайн

Go meetup

15 марта 2023

Уже совсем скоро мы встретимся на Go Meetup. Программа мероприятия формируется, но регистрация уже открыта. Кстати, вы уже можете подать доклад прямо в режиме онлайн. Заявки на участие принимаются до 1 марта.

Интересуетесь нашими мероприятиями? В Telegram-канале Evrone meetups мы выкладываем анонсы с подробными описаниями докладов, а также студийные записи прошедших митапов. Тем для кого выступать в новинку, мы оказываем всяческую поддержку и помогаем оформить экспертизу в яркое выступление. Подписывайтесь и пишите @andrew_aquariuss, чтобы узнать подробности.

Регистрация

Вакансии

Удаленка / Офис

Evrone 

Мы открыты для новых Go-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.

Подробнее

Подписаться
на Digest →
Важные новости и мероприятия без спама
Технологии которыми вы владеете и которые вам интересны
Ваш адрес электронной почты в безопасности - вот наша политика конфиденциальности.