Добавление метаинформации к вашим данным.

Go - это не чистый объектно-ориентированный язык программирования. Он не предоставляет классов, но предоставляет структуры.

Как указано в спецификации языка:

Структура - это последовательность именованных элементов, называемых полями, у каждого из которых есть имя и тип.

Структура используется, когда вы хотите определить схему для ваших данных, состоящую из различных свойств (полей).

Поле можно идентифицировать:

  • Явно: как и в структуре Person выше, все поля объявлены в одной структуре.
  • Неявно: как и в структуре User, она встраивает поля из структуры Person. Это также известно как встроенные поля. Вы можете получить к ним доступ, как если бы они были объявлены внутри самой структуры.

Теги

За каждым полем может следовать необязательный строковый литерал, называемый tag. Этот тег станет атрибутом поля.

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

Эти метаданные объявляются с помощью строкового литерала в формате key:"value" и разделяются пробелом. То есть в одном поле может быть несколько тегов для разных целей и для разных библиотек.

type T struct {
  Field fieldtype `key1:"value1" key2:"value2"`
}

У каждого пакета есть свои собственные key имена, обычно это имя самого пакета.

Некоторые примеры использования:

  • Цели кодирования / декодирования (как в пакетах json и xml);
  • ORM (типа Beego и Gorm);
  • Валидация (типа здесь);
  • Управление конфигурацией;
  • Значения по умолчанию для структур.

Отражение

Чтобы получить доступ к тегам и использовать их, вы должны использовать пакет reflect.

Если используется обычный формат, мы можем использовать два метода StructTag для получения информации о теге: Get и Lookup.

Примечание: метод Lookup возвращает дополнительное значение ok, указывающее, был ли тег найден в поле или нет.

Пример

Давайте создадим пример того, как его использовать.

В нашем случае давайте создадим тег с именем color, который будет указывать, каким цветом мы собираемся напечатать поле. Для простоты будут доступны только цвета blue, red и yellow.

Примечание: в этом примере я использую пакет color.

Функция PrintWithColor сделает это за нас. Он получает объект и проверяет все поля на наличие тега color. Если он его находит, он устанавливает соответствующий цвет для консоли и печатает значение. Если нет, он просто печатает значение.

Если вы запустите его, вы можете получить что-то вроде этого:

Конечно, этот пример прост, но вы можете получить представление об использовании тега в структуре. Для более продвинутого использования вы можете проверить пакет json.

Заключение

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

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

Это сделает ваш код более чистым и читаемым.