Подтвердить что ты не робот

Go lang, struct: какой третий параметр

type Config struct {
    CommitIndex uint64 `json:"commitIndex"`
    // TODO decide what we need to store in peer struct
    Peers []*Peer `json:"peers"`
}

Я понимаю первые 2 колонки. Но, что такое json: "commitIndex"

спасибо.

4b9b3361

Ответ 1

Он называется тегом struct, он может быть проанализирован с помощью пакета reflect во время выполнения.

Из https://golang.org/ref/spec#Struct_types:

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

Теги становятся видимыми через интерфейс отражения и принимают участие в идентификаторе типа для структур, но в противном случае игнорируются.

Некоторые пакеты, которые используют отражение, например json и xml используйте теги, чтобы лучше обрабатывать специальные случаи.

Ответ 2

То, о чем вы говорите, называется тегом, а Перейти спецификации:

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

// A struct corresponding to the TimeStamp protocol buffer.
// The tag strings define the protocol buffer field numbers.
struct {
    microsec  uint64 "field 1"
    serverIP6 uint64 "field 2"
    process   string "field 3"
}

Это ничего не делает во время компиляции, но используется различными пакетами при анализе времени выполнения структуры. Как уже отмечал Амит, пакет encoding/json использует его для указания поведения маршаллинга/разборки. То же самое происходит с encoding/xml, gopkg.in/mgo.v2/bson и т.д.

Строка тега условно разделяет пробел. Как указано в пакете reflect:

По соглашению, строки тегов являются конкатенацией опционально ключ, разделенный пробелом: пары "значение". Каждый ключ представляет собой непустую строку состоящий из неконтролируемых символов, кроме пробела (U + 0020 ''), quote (U + 0022 '"') и двоеточие (U + 003A ':'). Каждое значение цитируется с использованием U + 0022 '' 'и синтаксис строкового литерала Go.