Назад к вопросам
Middle
137
questionbank

Как в языке Go реализованы концепции объектно-ориентированного программирования (ООП)?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

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

  • Структуры (Structs): Объединяют данные (поля).
    type Person struct {
    	Name string
    	Age  int
    }
    
  • Методы: Функции с ассоциированным получателем (структурой или другим типом). Позволяют структурам иметь поведение.
    func (p Person) Greet() string {
    	return "Hello, my name is " + p.Name
    }
    
    • Получатель по значению: Метод работает с копией структуры. Изменения внутри метода не затрагивают оригинальную структуру.
    • Получатель по указателю: Метод работает с оригинальной структурой через указатель. Изменения внутри метода затрагивают оригинальную структуру.
  • Интерфейсы (Interfaces): Определяют набор сигнатур методов, которым должен соответствовать тип. Обеспечивают полиморфизм "по утиной типизации" (duck typing). Тип неявно реализует интерфейс, если реализует все его методы.
    type Greeter interface {
    	Greet() string
    }
    
    func SayHello(g Greeter) string {
    	return g.Greet()
    }
    
  • Встраивание (Embedding): Позволяет одной структуре "встраивать" другую структуру или интерфейс. Это не наследование в классическом смысле, скорее композиция. Встраиваемая структура становится анонимным полем, к ее полям и методам можно обращаться напрямую через экземпляр встраивающей структуры.
    type Employee struct {
    	Person // встроена структура Person
    	ID string
    }
    
    // Employee теперь имеет поля Name и Age, а также метод Greet()
    
    e := Employee{
    	Person: Person{Name: "Alice", Age: 30},
    	ID:     "E123",
    }
    fmt.Println(e.Greet()) // вызов метода Greet() структуры Person через Employee
    
Концепция ООП Реализация в Go Замечания
Классы Структуры Нет явного ключевого слова class
Инкапсуляция Экспортируемые (с заглавной буквы) / Неэкспортируемые (с маленькой буквы) поля/методы Управление видимостью на уровне пакета
Наследование Встраивание (Embedding) Композиция вместо иерархического наследования
Полиморфизм Интерфейсы Duck typing, неявная реализация интерфейсов