Назад к вопросам
Middle
104
questionbank

Как устроена объектно-ориентированная модель в 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 построена на композиции структур и поведении, определяемом интерфейсами, а не на классической иерархии наследования классов.