Опишите подходы к объектно-ориентированному программированию в Go

Ответ

В Go отсутствует классическое ООП с классами, наследованием и иерархией типов. Вместо этого язык предлагает прагматичный и гибкий подход, основанный на композиции и интерфейсах.

Ключевые концепции:

  1. Структуры (structs) вместо классов. Структуры используются для группировки данных. Они являются аналогом полей класса.

    type User struct {
        ID   int
        Name string
    }
  2. Методы для любых типов. В Go методы можно определять для любого именованного типа, а не только для структур. Это позволяет добавлять поведение к простым типам.

    func (u User) Greet() string {
        return "Hello, my name is " + u.Name
    }
  3. Композиция вместо наследования. Go поощряет использование композиции через встраивание (embedding). Встроенная структура делегирует свои поля и методы родительской структуре, что позволяет достичь повторного использования кода.

    type Admin struct {
        User      // Встроенный тип User
        AccessLevel string
    }
    
    // admin := Admin{}
    // admin.Name = "John Doe" // Доступ к полю встроенной структуры
    // admin.Greet()          // Доступ к методу встроенной структуры
  4. Интерфейсы для полиморфизма. Интерфейсы в Go определяют поведение (набор методов). Тип удовлетворяет интерфейсу неявно, если он реализует все его методы. Это обеспечивает гибкость и слабую связность компонентов.

    type Greeter interface {
        Greet() string
    }
    
    // Тип User неявно реализует интерфейс Greeter

Итог: Go придерживается принципа "композиция вместо наследования", предлагая более простую и гибкую модель. Отсутствуют конструкторы, деструкторы, перегрузка методов и операторов, что делает код более предсказуемым и легким для чтения.