Структура (struct) - это последовательность именованных элементов, называемых полями, каждый из которых имеет имя и тип. Имена полей могут быть указаны явно (IdentifierList) или неявно (EmbeddedField). В структуре непустые имена полей должны быть уникальными.
StructType = "struct" "{" { FieldDecl ";" } "}" .
FieldDecl = (IdentifierList Type | EmbeddedField) [ Tag ] .
EmbeddedField = [ "*" ] TypeName .
Tag = string_lit .
// Пустая структура.
struct {}
// Структура с 6 полями.
struct {
x, y int
u float32
_ float32 // padding
A *[]int
F func()
}
Поле, объявленное с типом, но без явного имени поля, называется встроенным полем. Встроенное поле должно быть указано как имя типа T или как указатель на имя не интерфейсного типа *T, а само T может не быть указателем типа. Неквалифицированное (unqualified) имя типа действует как имя поля.
// Структура с 4 встроенными (embedded) полями типов T1, *T2, P.T3 и *P.T4
struct {
T1 // имя поля T1
*T2 // имя поля T2
P.T3 // имя поля T3
*P.T4 // имя поля T4
x, y int // имена полей x и y
}
Следующее объявление недопустимо, потому что имена полей должны быть уникальными в типе структуры:
struct {
T // конфликтует с встроенным (embedded) полем *T и *P.T
*T // конфликтует с встроенным (embedded) полем T и *P.T
*P.T // конфликтует с встроенным (embedded) полем T и *T
}
Поле или метод f встроенного поля в структуре x называется продвигаемым (promoted), если x.f является допустимым селектором, который обозначает это поле или метод f.
Продвигаемые поля действуют как обычные поля структуры, за исключением того, что они не могут использоваться в качестве имен полей в составных литералах структуры.
При заданном типе структуры S и определенном типе T продвигаемые методы включаются в набор методов структуры следующим образом:
- Если S содержит встроенное поле T, наборы методов S и *S включают в себя продвигаемые методы с получателем T. Набор методов *S также включает продвигаемые методы с получателем *T.
- Если S содержит встроенное поле *T, наборы методов S и *S оба включают продвигаемые методы с получателем T или *T.
За объявлением поля может следовать необязательный тег из строкового литерала, который становится атрибутом для всех полей в соответствующем объявлении поля. Пустая строка тега эквивалентна отсутствующему тегу. Теги становятся видимыми через интерфейс отражения (reflection interface) и принимают участие в идентификации типов для структур, но в остальном игнорируются.
struct {
x, y float64 "" // пустая строка в виде тега эквивалентна отсутствию тега
name string "люба строка допустима в виде тега"
_ [4]byte "ceci n'est pas un champ de structure"
}
// Структура соответствующая буферу TimeStamp протокола.
// Теговые строки определяют номера поля буфера протокола;
// они следуют соглашению обозначенному в reflect пакете.
struct {
microsec uint64 `protobuf:"1"`
serverIP6 uint64 `protobuf:"2"`
}
Читайте также:
- Спецификация Go: типы (types)
- Спецификация Go: логические, числовые, строковые типы
- Основы Go: структуры (struct)
Комментариев нет:
Отправить комментарий