TGViewer
Библиотека Go (Golang) разработчика Библиотека Go (Golang) разработчика @golang_lib · 2.7K subscribers
Post #703 512
🏗 go generate: Как писать код, который пишет код (и побеждает рефлексию)

В прошлом посте мы выяснили, что пакет reflect - это медленно и опасно. Но как тогда писать универсальные инструменты? Валидаторы, парсеры, моки для тестов?

В языках вроде Rust есть мощные макросы. В Java - аннотации и байт-код магия. В Go создатели пошли по пути брутальной простоты и дали нам Кодогенерацию.

Идея звучит как лозунг киберпанка: "Пусть программа сама напишет для нас скучный код ДО того, как мы её скомпилируем".

Как работает //go:generate

В Go встроен специальный механизм. Если вы напишете в любом файле магический комментарий (строго без пробела после //), тулчейн сможет его найти и выполнить.

Возьмем классическую боль Go - "энумы" (перечисления). У нас есть статусы заказа, и мы хотим красиво выводить их в логи:


package order

//go:generate stringer -type=Status

type Status int

const (
Created Status = iota
Paid
Shipped
)



Вы открываете терминал, вводите одну команду:


go generate ./...



И тулчейн находит ваш комментарий, запускает утилиту stringer, которая за миллисекунду генерирует рядом файл status_string.go. В нем лежит гигантский, тупой, но молниеносно быстрый switch, который превращает ваши константы в строки.

Никакой рефлексии. Никакого парсинга в рантайме. Чистый, скомпилированный машинный код.

Почему Кодогенерация > Рефлексии в HighLoad?

1. Скорость: Сгенерированный код работает в 10-50 раз быстрее рефлексии (вспомните easyjson против encoding/json).
2. Безопасность: Если структура изменилась, а сгенерированный код устарел - у вас просто не соберется проект. Компилятор ударит по рукам. При рефлексии вы узнаете об ошибке только когда код упадет с паникой на проде.
3. Читаемость: Сгенерированный код можно прочитать глазами, поставить брейкпоинт и отладить по шагам. Отладить кишки reflect.Value - задача для сильных духом.

Где это используют каждый день?

• Тесты (mockgen / vektra/mockery): Генерация моков для интерфейсов. Никто не пишет заглушки руками.
• Базы данных (sqlc): Вы пишете чистый SQL-запрос в файл .sql, а утилита генерирует под него Go-структуры и типобезопасные функции.
• API (oapi-codegen / protoc): Генерация HTTP-роутеров и структур из OpenAPI (Swagger) или gRPC/Protobuf контрактов.

🔥 Senior Tip: Коммитить ли сгенерированный код в Git?

Вечный холивар. Вы сгенерировали 10 000 строк моков. Нужно ли пушить их в репозиторий?

Официальный ответ от команды Go: ДА.
Сгенерированный код нужно коммитить. Это гарантирует, что любой разработчик (или CI-сервер) сможет просто сделать go build или go test, не устанавливая себе локально на ноутбук зоопарк специфичных кодогенераторов нужных версий.

Кодогенерация - это легальный чит-код в Go. Вы пишете меньше кода, а программа работает быстрее.

#golang #architecture #performance #codegen #bestpractices

📲 Мы в MAX

👉 @golang_lib
  • 🔥 4
  • 👍 1
More from @golang_lib
  1. Sep 22, 2026🔴AI кодинг интервью с разработчиком из международного FinTech в четверг в 19:00 ДА! Вайбк…
  2. Sep 21, 2026📢 sync.Cond: Как разбудить 10 000 горутин одним вызовом (и не сломать планировщик) Предст…
  3. Sep 17, 2026🔎 pprof: Как найти функцию, которая жрет 80% CPU Сервис на проде внезапно упирается в пол…
  4. Sep 7, 2026🗺️ sync.Map: Почему эта «серебряная пуля» иногда пробивает дно производительности Как тол…
  5. Sep 2, 2026☢️ Пакет unsafe: Взламываем систему типов Go Пакет unsafe - это легальный способ сказать к…
  6. Sep 1, 2026🔴 Тестовое собеседование с Go Senior с опытом работы в Яндексе, EPAM и Uzum в этот четвер…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →