Структуры в Go
Теория: Теги и работа с JSON
В Go структура — это набор полей. Когда мы передаем данные наружу (например, в API в формате JSON), часто сталкиваемся с тем, что названия полей в Go и в JSON отличаются. В Go принято использовать CamelCase, а в JSON — snake_case или просто маленькие буквы. Кроме того, иногда нам нужно скрыть часть информации (например, пароль), а иногда — не отправлять пустые значения, чтобы не засорять ответ.
Решение этих задач — теги структур.
Тег — это строка в обратных кавычках, которая задает правила преобразования. Обычно он выглядит так:
Простой пример
Если не использовать теги:
С тегами:
Вывод: благодаря тегам мы получили JSON с привычными ключами, а не с Go-шными названиями полей.
Скрытие полей
Частая задача — не показывать пароли, токены и служебную информацию. Для этого используют json:"-".
Вывод: тег - гарантирует, что поле не попадет в JSON. Это защита от случайной утечки данных.
Пропуск пустых значений
Опция omitempty убирает из JSON поля с нулевым значением.
Здесь price не попал в JSON, потому что у float64 нулевое значение 0.0.
Вывод: omitempty экономит трафик и делает JSON чище. Особенно полезно в API.
Несколько имен
Go умеет читать данные даже с другими ключами, если поле экспортируемое. Но если JSON приходит с совсем другим названием, без тегов не обойтись.
Если ключи не совпадут:
Вывод: всегда сверяйтесь с документацией API и прописывайте правильные теги.
Комбинации тегов
Можно задавать несколько правил сразу:
Вывод: через теги мы полностью контролируем, что уйдет наружу, а что останется внутри программы.
Разные кейсы использования
Работа с API
Представьте, что ваш сервис отправляет данные во внешний API, который требует ключи в snake_case.
Внутренние структуры и приватные данные
Представим, что мы храним токен авторизации, но не хотим сериализовать его:
Пример:
Вывод: теги помогают разграничивать внутреннее и внешнее представление данных.
Оптимизация ответов
Если у нас много опциональных полей (например, адрес, отчество, промокод), лучше использовать omitempty. Так JSON будет меньше и чище.
Когда не стоит использовать теги
Иногда структура с тегами — это «жесткая схема». Если внешний API часто меняется, а ключи приходят разные, может быть проще использовать map[string]interface{}:
Минус такого подхода — теряется типизация, и придется вручную проверять типы.
Вывод:
- Для стабильных API — лучше использовать структуры с тегами.
- Для нестабильных или динамических данных — map или interface{}.


