Встроенные структуры 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 есть два способа составления структур: анонимные встроенные поля и явные поля.
Анонимные встроенные поля позволяют методам и свойствам из встроенной структуры автоматически повышаться до вложенной структуры, но существует вероятность того, что эти методы и свойства будут затенены, если вложенная структура объявляет методы свойств с тем же именем.
Явные поля напрямую связывают имя поля с вложенной структурой, чтобы доступ к методам и свойствам вложенной структуры был однозначным. В рабочем коде часто лучше использовать явные поля, а не анонимные встроенные поля, чтобы сделать код более читабельным и не удивляться скрытым полям.