В Go нет классов в привычном понимании ООП. Как в языке эмулируются концепции класса и абстрактного класса?

Ответ

В Go принят подход "композиция вместо наследования". Вместо классов используются структуры (struct) для данных и интерфейсы (interface) для поведения.

Эмуляция Класса

Класс в классическом ООП — это шаблон для объектов, объединяющий данные (поля) и поведение (методы). В Go эту роль выполняет структура с методами.

// Аналог класса "Собака"
type Dog struct {
    Name string
    Age  int
}

// Метод для структуры Dog
func (d Dog) Bark() string {
    return "Гав!"
}

Эмуляция Абстрактного Класса

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

Интерфейс в Go — это набор сигнатур методов. Любой тип, реализующий все методы интерфейса, неявно удовлетворяет этому интерфейсу.

// Аналог абстрактного класса "Животное"
type Animal interface {
    Speak() string
    GetName() string
}

// Dog реализует интерфейс Animal
func (d Dog) Speak() string {
    return "Гав!"
}
func (d Dog) GetName() string {
    return d.Name
}

// Cat тоже реализует интерфейс Animal
type Cat struct {
    Name string
}
func (c Cat) Speak() string {
    return "Мяу!"
}
func (c Cat) GetName() string {
    return c.Name
}

Ключевые отличия от классического ООП

АспектКлассическое ООП (Java, C++)Подход в Go
НаследованиеКлассы могут наследовать реализацию от одного родителя.Нет наследования реализации. Используется встраивание (embedding) для композиции.
ПолиморфизмЧерез наследование и виртуальные методы.Через интерфейсы. Тип удовлетворяет интерфейсу неявно.
ИерархияЖесткая иерархия классов.Гибкая система, основанная на поведении (методах).
АбстракцияАбстрактные классы и интерфейсы.Только интерфейсы.