Какова роль структуры в Go и как она соотносится с классами в классическом ООП?

Ответ

В Go нет классов в их классическом понимании. Их роль выполняют структуры (struct) в сочетании с методами.

Структуры в Go — это основной инструмент для создания пользовательских типов данных, группируя вместе поля разных типов. Они служат аналогом классов из традиционных объектно-ориентированных языков.

// Определение структуры для пользователя
type User struct {
    Name string
    Age  int
}

// Метод для типа User. `u` - это ресивер (receiver).
func (u User) Greet() string {
    return fmt.Sprintf("Привет, меня зовут %s, мне %d лет.", u.Name, u.Age)
}

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

  • Отсутствие наследования. Вместо наследования реализации в Go используется композиция, когда одна структура встраивается в другую.
  • Инкапсуляция через экспорт. Управление доступом реализовано на уровне пакетов. Имена, начинающиеся с заглавной буквы (например, User, Name), экспортируются и доступны из других пакетов. Имена с маленькой буквы — приватны в рамках своего пакета.
  • Методы определяются отдельно. Методы не являются частью определения структуры, а объявляются для типа с помощью ресивера.

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