Как устроена объектно-ориентированная модель в Go?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
В Go отсутствует традиционная объектно-ориентированная модель с глубокой иерархией наследования классов. Вместо этого используются:
-
Структуры (Structs): Определяют поля данных, аналогично классам без методов.
type Person struct { Name string Age int } -
Методы: Функции, привязанные к определенной структуре. Они определяются отдельно от структуры.
func (p Person) Greet() string { return "Hello, my name is " + p.Name } func (p *Person) CelebrateBirthday() { p.Age++ }- Методы с получателем-значением (например,
(p Person)) работают с копией структуры. - Методы с получателем-указателем (например,
(p *Person)) работают с оригиналом структуры, позволяя изменять ее поля.
- Методы с получателем-значением (например,
-
Интерфейсы: Наборы сигнатур методов. Типы, реализующие все методы интерфейса, неявно удовлетворяют этому интерфейсу. Это основа полиморфизма в Go.
type Greeter interface { Greet() string } // Person неявно реализует Greeter -
Композиция (Встраивание): Вместо наследования, одна структура может встраивать другую структуру, получая доступ к ее полям и методам.
type Employee struct { Person // Встраиваем структуру Person ID string } func (e Employee) GetID() string { return e.ID }Встроенные поля и методы доступны напрямую:
e := Employee{ Person: Person{Name: "Alice", Age: 30}, ID: "E123", } fmt.Println(e.Name) // Доступ к полю Name через встроенную Person fmt.Println(e.Greet()) // Вызов метода Greet через встроенную Person fmt.Println(e.GetID()) // Вызов метода Employee
Таким образом, объектно-ориентированная модель в Go построена на композиции структур и поведении, определяемом интерфейсами, а не на классической иерархии наследования классов.