Ответ
В 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 стиле.