понедельник, 3 июня 2019 г.

Спецификация Go: объявление типа

Объявление типа связывает идентификатор, имя типа, с типом. Объявления типов представлены в двух формах: объявления псевдонимов (alias declarations) и определения типов (type definitions).

TypeDecl = "type" ( TypeSpec | "(" { TypeSpec ";" } ")" ) .
TypeSpec = AliasDecl | TypeDef .

Объявления псевдонимов (alias declarations)

Объявление псевдонима связывает идентификатор с данным типом.

AliasDecl = identifier "=" Type .

В рамках идентификатора он служит псевдонимом для типа.

type (
  nodeList = []*Node  // nodeList и []*Node идентичные типы
  Polar    = polar    // Polar и polar обозначают идентичные типы
)

Определения типов (Type definitions)

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

TypeDef = identifier Type .

Новый тип называется определенным (defined) типом. Он отличается от любого другого типа, включая тип, из которого он создан.

type (
  Point struct{ x, y float64 }  // Point и struct{ x, y float64 } различные типы
  polar Point                   // polar и Point обозначают различные типы
)

type TreeNode struct {
  left, right *TreeNode
  value *Comparable
}

type Block interface {
  BlockSize() int
  Encrypt(src, dst []byte)
  Decrypt(src, dst []byte)
}

С определенным типом могут быть связаны методы. Он не наследует никакие методы, связанные с данным типом, но набор методов типа интерфейса или элементов составного типа остается неизменным:

// Mutex это тип данных с двумя методами, Lock и Unlock.
type Mutex struct         { /* Mutex поля */ }
func (m *Mutex) Lock()    { /* Lock реализация */ }
func (m *Mutex) Unlock()  { /* Unlock реализация */ }

// NewMutex имеет тот же самый состав что и Mutex, 
// но его набор методов пуст.
type NewMutex Mutex

// Набор методов *Mutex, 
// являющегося базовым типом для PtrMutex, 
// остается неизмененным, но набор методов PtrMutex пустой.
type PtrMutex *Mutex

// Набор методов *PrintableMutex содержит методы
// Lock и Unlock привязанные к его встроенному типу Mutex.
type PrintableMutex struct {
  Mutex
}

// MyBlock это тип интерфеса, 
// который имеет такой же набор методов что и Block.
type MyBlock Block

Определения типов могут использоваться для определения различных логических, числовых или строковых типов и связывания с ними методов:

type TimeZone int

const (
  EST TimeZone = -(5 + iota)
  CST
  MST
  PST
)

func (tz TimeZone) String() string {
  return fmt.Sprintf("GMT%+dh", tz)
}


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


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

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