Ответ
В Go используется собственный подход к объектно-ориентированному программированию, основанный на композиции, а не на наследовании. Вместо классов и иерархий наследования, Go предлагает следующие концепции:
-
Структуры (structs) — это композитные типы данных, которые объединяют поля (атрибуты) разных типов. Они являются аналогом классов для хранения данных.
// Person определяет структуру с полями Name и Age. type Person struct { Name string Age int }
-
Методы (methods) — это функции, привязанные к определенному типу (получателю/receiver). Они позволяют добавлять поведение к данным.
// Greet - это метод типа Person. func (p Person) Greet() { fmt.Printf("Привет, меня зовут %sn", p.Name) }
-
Встраивание (Embedding) — это механизм композиции, который служит аналогом наследования. Он позволяет одной структуре включать в себя другую, "наследуя" её поля и методы.
type Employee struct { Person // Встраивание типа Person Salary float64 } // Теперь у Employee есть доступ к полям Name, Age и методу Greet.
-
Интерфейсы (interfaces) и Утиная типизация (Duck Typing) — интерфейсы определяют набор методов. Тип удовлетворяет интерфейсу неявно, если он реализует все его методы. Это известно как утиная типизация: "Если что-то крякает как утка и ходит как утка, то это утка".
type Greeter interface { Greet() } // Эта функция может принять любой тип, реализующий интерфейс Greeter. func SayHello(g Greeter) { g.Greet() }
Такой подход способствует созданию более гибкого и менее связанного кода, избегая жестких иерархий классов.