понедельник, 27 мая 2019 г.

Спецификация Go: типы структур (struct types)

Структура (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"`
}


Читайте также:


Комментариев нет:

Отправить комментарий