Объявление типа связывает идентификатор, имя типа, с типом. Объявления типов представлены в двух формах: объявления псевдонимов (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)
}
Читайте также:
- Спецификация Go: типы (types)
- Спецификация Go: типы структур (struct types)
- Спецификация Go: идентификаторы
Комментариев нет:
Отправить комментарий