Что такое аннотация в Go и зачем она нужна
Что проверяют
Не столько термин, сколько привычку переносить понятия из других языков. В Go нет аннотаций как языковой конструкции, и правильный ответ начинается именно с этого, а дальше объясняет, чем их роль закрывают на практике.
Как отвечать
Скажите прямо: аннотаций в языке нет, компилятор про них ничего не знает. Похожую задачу решают две разные вещи.
Первое это теги полей структуры. Обычная строка в обратных кавычках после типа поля, доступная только через reflect. Библиотеки читают её сами, по соглашению ключ и значение.
type User struct {
Name string `json:"name"`
Email string `json:"email,omitempty"`
hash string
}Второе это директивы компилятора и инструментов: //go:generate, //go:embed, //go:build. Это тоже не аннотации, а команды для тулчейна, и пишутся они комментарием без пробела после слэшей, иначе просто игнорируются.
Дальше полезно проговорить цену. Тег это строка без проверки типов: опечатка в ключе не сломает сборку, поле просто тихо уедет в вывод под своим именем. Ловят это линтером, встроенная проверка тегов есть в стандартном наборе go vet. И чтение тегов идёт через рефлексию, то есть в горячем пути оно дороже, чем ручная сборка результата.
Где спотыкаются
Пересказывают устройство аннотаций из другого языка и обещают поведение, которого нет. Тег сам по себе ничего не выполняет и ни к чему не привязывается, пока конкретная библиотека его не прочитает.
Забывают про экспорт. Поле с маленькой буквы не попадёт в вывод ни с каким тегом, потому что рефлексия не читает неэкспортируемые поля. Отсюда классический баг: структура заполнена, а на выходе пустой объект.
Путают директивы с обычными комментариями и ставят пробел после слэшей. Такая строка становится простым текстом: генерация не запускается, файл не встраивается, условие сборки не действует, и по результату сборки этого не видно, она проходит успешно.