Как в Go реализуются принципы ООП?

Ответ

В Go используется собственный подход к объектно-ориентированному программированию, основанный на композиции, а не на наследовании. Вместо классов и иерархий наследования, Go предлагает следующие концепции:

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

    // Person определяет структуру с полями Name и Age.
    type Person struct {
        Name string
        Age  int
    }
  2. Методы (methods) — это функции, привязанные к определенному типу (получателю/receiver). Они позволяют добавлять поведение к данным.

    // Greet - это метод типа Person.
    func (p Person) Greet() {
        fmt.Printf("Привет, меня зовут %sn", p.Name)
    }
  3. Встраивание (Embedding) — это механизм композиции, который служит аналогом наследования. Он позволяет одной структуре включать в себя другую, "наследуя" её поля и методы.

    type Employee struct {
        Person // Встраивание типа Person
        Salary float64
    }
    // Теперь у Employee есть доступ к полям Name, Age и методу Greet.
  4. Интерфейсы (interfaces) и Утиная типизация (Duck Typing) — интерфейсы определяют набор методов. Тип удовлетворяет интерфейсу неявно, если он реализует все его методы. Это известно как утиная типизация: "Если что-то крякает как утка и ходит как утка, то это утка".

    type Greeter interface {
        Greet()
    }
    
    // Эта функция может принять любой тип, реализующий интерфейс Greeter.
    func SayHello(g Greeter) {
        g.Greet()
    }

Такой подход способствует созданию более гибкого и менее связанного кода, избегая жестких иерархий классов.