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

Ответ

В Go нет классов в классическом понимании, но многие концепции объектно-ориентированного программирования (ООП) реализуются с помощью структур, методов и интерфейсов.

Структуры (struct) играют центральную роль в реализации следующих концепций:

  1. Инкапсуляция: Структура объединяет данные (поля) и поведение (методы) в единый тип. Управление видимостью (public/private) достигается через капитализацию имен: имена, начинающиеся с заглавной буквы, экспортируются (public), а с маленькой — нет (private для пакета).

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

  3. «Наследование» через встраивание (Embedding): Go позволяет встраивать одну структуру в другую. Это не является наследованием, а формой композиции, но обеспечивает похожий синтаксис. Поля и методы встроенной структуры «поднимаются» на уровень внешней, что позволяет обращаться к ним напрямую.

    type Person struct { // Базовый тип
        Name string
    }
    
    func (p *Person) Greet() {
        fmt.Printf("Hello, my name is %sn", p.Name)
    }
    
    type Employee struct {
        Person     // Встраивание Person
        Company string
    }
    
    func main() {
        emp := Employee{
            Person:  Person{Name: "Alice"},
            Company: "TechCorp",
        }
        // Можно напрямую вызывать поля и методы встроенной структуры
        fmt.Println(emp.Name) // Вывод: Alice
        emp.Greet()           // Вывод: Hello, my name is Alice
    }
  4. Полиморфизм: Хотя полиморфизм в Go достигается через интерфейсы, именно структуры (с их методами) реализуют эти интерфейсы, что позволяет использовать объекты разных типов взаимозаменяемо.