Встроенные структуры Golang

В Golang нет концепций объектов и наследования. Дизайн языка сильно самоуверен и очень близко следует объектно-ориентированным принципам (ООП), поэтому он предпочитает композицию наследованию. Golang использует структуры и методы для эмуляции объектов. Например,

type Bird struct {
}
func (b Bird) makeSound() {
  fmt.Println("chirp")
}

Golang позволяет создавать структуры внутри других структур. Существует два способа составления структур: анонимные встроенные поля и явные поля.

Анонимные встроенные поля

Анонимное встроенное поле — это поле структуры, не имеющее явного имени поля. Структуры с анонимным полем получают все методы и свойства вложенной структуры. Эти методы и свойства называются «продвинутыми» методами и свойствами. Доступ к анонимным встроенным полям также можно получить напрямую по имени типа.

type Eagle struct {
  Bird // anonymous embedded field
}
e := Eagle{name: "Baldie"}
e.makeSound() // chirp
e.Bird.makeSound() // chirp

Нюанс возникает из-за того, что структуры объявляют методы и свойства, которые также существуют во встроенной структуре. В этом случае методы и свойства встроенной структуры «затеняются», и будут использоваться методы и свойства вызываемой вами структуры. Вы по-прежнему можете получить доступ к теневым методам и свойствам, специально обратившись к встроенному полю, а затем вызвав метод или свойство.

func (e Eagle) makeSound(){
  fmt.Println("caw")
}
e.makeSound() // caw
e.Bird.makeSound() // chirp

Явные поля

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

type Eagle struct {
  b Bird // explicit field
}
func (e Eagle) makeSound(){
  fmt.Println("caw")
}
e := Eagle{name: "Baldie"}
e.makeSound() // caw
e.b.makeSound() // chirp
e.Bird.makeSound() // error

Здесь, чтобы вызвать метод makeSound() Bird, нужно явно получить доступ к вложенному объекту Bird, используя .b. Больше невозможно получить доступ к основному полю .Bird.

Заключение

Таким образом, в Golang есть два способа составления структур: анонимные встроенные поля и явные поля.

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

Явные поля напрямую связывают имя поля с вложенной структурой, чтобы доступ к методам и свойствам вложенной структуры был однозначным. В рабочем коде часто лучше использовать явные поля, а не анонимные встроенные поля, чтобы сделать код более читабельным и не удивляться скрытым полям.

Рекомендации