type People struct {
Name string `json:"name"`
Age int8 `json:"age"`
}
В процессе обучения, когда я увидел код, похожий на приведенный выше, я был ошеломлен. . . Насчет чека, это в ГолангеTagsСинтаксис, официальное объяснение выглядит следующим образом:
A field declaration may be followed by an optional string literal tag, which becomes an attribute for all the fields in the corresponding field declaration. The tags are made visible through a reflection interface but are otherwise ignored.
Официальное объяснение недостаточно обосновано. Для таких новичков, как я, смотреть его равносильно тому, чтобы не смотреть. Мы можем добавить несколько реальных сцен, чтобы понять, что он может делать. Поскольку разметку полей в Golang можно найти вотражениеОбычно он используется для предоставления сведений о некоторых правилах преобразования в процессе преобразования кодировки структуры, таких как преобразование JSON, упомянутое в следующем примере. Конечно, вы также можете использовать его для хранения любой другой метаинформации, которую вы хотите.
Например
Возьмите пример API 🌰, получите информацию о пользователе с идентификатором пользователя 1:GET /v1/user/1
. Самый простой способ — получить запись пользовательской таблицы базы данных и вернуть ее в формате JSON.
type User struct {
Id int
Name string
Age int8
}
Если обработка не выполняется, данные, возвращаемые в это время, должны быть следующими:
{"Id":1,"Name":"X.FLY","Age":24}
Эй, почему они все возвращают мне горбатые имена атрибутов? Кто сказал вам объявлять структуру User с такими именами свойств. Затем измените имя свойства структуры на нижний регистр. 🚫 Нет 🚫, потому что тогда эти свойства станут частными свойствами, не забывайте, что в Голанге нет ключевых слов public/private/protected, он весь отличается заглавной буквой первой буквы! что теперь? использоватьTagах 😂
Мы помечаем свойства структуры:
type User struct {
Id int `json:"id"`
Name string `json:"name"`
Age int8
}
Намеренно не помечая возраст, чтобы увидеть разницу, вывод в формате JSON выглядит следующим образом:
{"id":1,"name":"X.FLY","Age":24}
ЭтоTagВолшебство этого не загрязняет основной корпус и не требует ручной обработки каждый раз, когда выводятся данные JSON (ну, удаление ключевых слов, таких как public, обходится дорого 😅).
инструкции
TagЭто может быть любая строка, ниже приведена общая форма, не думайте об этом🤭
как правило,Tagвсе сkey:"value"
В форме этой пары ключ-значение, если есть несколько пар ключ-значение, они разделяются пробелами.
type User struct {
Name string `json:"name" xml:"name"`
}
keyОбычно относится к используемому имени пакета, например, здесь json указывает, что поле Имя будетencoding/jsonИспользование пакетов и обращение с ними.
Если есть несколькоvalueЕсли информация должна быть передана, то обычно используется запятая.,
разделять.
type User struct {
Name string `json:"name,omitempty" xml:"name"`
}
omitemptyУказывает, что если значение этого поля пусто во время кодирования и декодирования (определяется как false, 0, нулевой указатель, нулевое значение интерфейса и любой пустой массив, срез, карта или строка), то это поле игнорируется. Другой часто используемый-, что означает прямое игнорирование этого поля.
понимать теги
Как упоминалось ранее, теги могут быть получены с помощью пакета отражения.На самом деле, за исключением информации о теге, которую можно получить с помощью механизма отражения, эти теги невидимы для других методов! Давайте сначала взглянем на часть StructTag официального отражения,reflect - The Go Programming Language.
StructTagдаstringПсевдонимы для примитивных типов:type StructTag string
, установленное правилоkey:"value"
Такие пары ключ-значение. (если я не буду следовать этомусоглашениесделать это? Конечно, можно, но это приведет кStructTag.Get()
Метод не может парсить вашу доработанную разметку, дальше можно реализовать только свою логику парсинга, короче вы счастливы 😏)
func (tag StructTag) Get(key string) string
Get()Функция используется для получения значения указанного ключа, например, есть тег, которыйmytag:"X.FLY"
,ТакGet("mytag") => X.FLY
func (tag StructTag) Lookup(key string) (value string, ok bool)
Lookup()Функция была добавлена после Golang 1.7, чтобы определить, существует ли указанный ключ.
Примеры использования можно найти вThe Go PlaygroundПопробуйте запустить выше, и здесь не так много общего с отражением.
Тег JSON
Здесь мы сосредоточимся на структурном теге JSON (1. Вывод JSON очень распространен; 2. Другие, такие как тег XML, могут быть получены по аналогии). Я хочу знать, какие теги есть в JSON, где их найти? Перейти на официальный сайтJSON.MarshalНайдите его в документации по функциям.
Кодировку каждого поля структуры можно настроить с помощью строки формата, хранящейся под ключом "json" в теге поля структуры. Строка формата содержит имя поля, за которым может следовать список параметров, разделенных запятыми. Имя может быть пустым, чтобы указать параметры без переопределения имени поля по умолчанию. Мы обнаружим, что в процессе кодирования JSON мы получим метку каждого поля Struct, а ключ от него получим как
json
значение, а затем обработать соответствующим образом.
Обратите внимание на правила синтаксического анализа: первая строка значения должна представлять новое имя поля после перезаписи, а если есть параметры синтаксического анализа, они разделяются запятыми.
НапримерName string json:"name,omitempty"
, имя первой строки указывает, что имя атрибута Name становится именем после кодирования. Затем следует разделитель запятой, за которым следует опция omitempty.
- Что делать, если я не хочу переопределять, а просто хочу добавить параметры?
Name string json:",omitempty"
, начинайте сразу с запятой. - В крайнем случае, что, если мое имя поля называется Omitempty?
Omitempty string json:"omitempty,omitempty"
, помните, что первая строка представляет имя новой переменной, а не опции, так что одно и то же имя такое же, не бойтесь 🤪.
подумайте немного:
- string json:"-,"
и- string json:",-"
Какая разница 🧐?
- omitempty: Если значение поля пустое (определяется как false, 0, нулевой указатель, нулевое значение интерфейса и любой пустой массив, срез, карта или строка), то это поле игнорируется во время кодирования.
- -: Игнорируйте это поле без дальнейших церемоний.
- string: преобразование значения поля в строковый тип в JSON во время кодирования, только если тип поля — строка, число с плавающей запятой, целое число или логическое значение.
Другие теги
Некоторые часто используемые Struct Tag официально перечислены,Well known struct tags · golang/go Wiki · GitHub.