Проверяет понимание композиции и встраивания структур в Go как альтернативы классическому наследованию.
В Go отсутствует классическое наследование классов, как в Java или C++. Вместо этого язык предлагает композицию через встраивание структур. Это означает, что одна структура может включать другую, и все её поля и методы автоматически становятся доступными на уровне внешней структуры. Такой подход упрощает переиспользование кода и делает зависимости явными.
Чтобы встроить структуру, достаточно указать её тип без имени поля. Например, если у нас есть базовый тип Animal с методом Speak, мы можем встроить его в Dog. Тогда у экземпляра Dog будет доступен метод Speak напрямую.
type Animal struct {
Name string
}
func (a Animal) Speak() string {
return "..."
}
type Dog struct {
Animal
Breed string
}
func main() {
d := Dog{Animal: Animal{Name: "Rex"}, Breed: "Labrador"}
fmt.Println(d.Speak()) // доступен метод Animal
}Если внешняя структура определяет метод с тем же именем, что и встроенная, он перекрывает его. Это позволяет адаптировать поведение под конкретный тип.
func (d Dog) Speak() string {
return "Woof!"
}Встраивание также работает с интерфейсами. Если встроенная структура реализует интерфейс, внешняя структура автоматически удовлетворяет этому интерфейсу. Это даёт гибкость при проектировании систем.
Встраивание структур — это мощный инструмент для композиции в Go. Оно позволяет переиспользовать код без жёсткой иерархии, что упрощает тестирование и изменение поведения. Используйте его, когда нужно расширить функциональность существующего типа, но не хотите усложнять архитектуру наследованием.