Перейти к основному содержимому

5.10. Особенности языка

Разработчику Архитектору

Особенности языка

Структуры и интерфейсы

• Структуры и интерфейсы объявлены с понятными именами.
• Используются теги для JSON, если структура используется для сериализации (json:"fieldName").
• Методы интерфейса определены минимально и по назначению.
• Композиция структур вместо наследования, где это возможно.

Слайсы
Ёмкость слайса расширяется динамически при добавлении элементов, если текущая длина достигает ёмкости. Обычно, когда нужно увеличить ёмкость, она удваивается — то есть становится примерно в 2 раза больше прежней. Однако этот удвоенный рост действует только до определённого предела (около 256 элементов). После этого Go увеличивает ёмкость не в два раза, а примерно на 1.25 (то есть на четверть от текущей емкости). Такое поведение связано с оптимизацией использования памяти и выравниванием данных.

Работа с ошибками

• Ошибки возвращаются явно из функций (return err).
• Используются кастомные типы ошибок или fmt.Errorf с %w для обёртки ошибок.
• Важные ошибки логируются или обрабатываются на уровне вызова.

Работа с пакетами

• Пакеты не слишком большие, разделены по функционалу.
• Используются правильные уровни видимости: экспортируемые (с большой буквы) и неэкспортируемые элементы.
• Пакеты имеют README с описанием назначения (по возможности).

Оптимизация и производительность

• Используются срезы и карты эффективно (избегаем ненужных копирований).
• Избегается выделение памяти в горячих циклах.
• Используются каналы и горутины с правильным управлением (контекст, тайм-ауты).

go generate
В Go есть встроенный инструмент go generate, который генерирует код по директивам в коде.
Генерация кода помогает избегать рутинного написания однотипного кода, поддерживать DRY и улучшать структуру проектов. Разберёмся как это применить.
1. Добавляем директиву //go:generate
В нужном файле добавьте комментарий с инструкцией генерации.
2. Запускаем генерацию
3. Использование с другими инструментами
go generate запускает любую shell-команду, поэтому можно использовать stringer для генерации методов String() по константам: //go:generate stringer -type=MyEnum.
Также можно использовать собственные скрипты на Go или Bash для генерации конфигураций или шаблонов.
Запустив go generate, будет создан файл color_string.go с реализацией метода String() для перечисления Color.