Вопрос проверяет, как в Go реализуются ООП-принципы, несмотря на отсутствие классов и наследования.
В Go полиморфизм реализуется через интерфейсы, а инкапсуляция — через экспортируемые и неэкспортируемые идентификаторы. Наследования нет, но встраивание структур позволяет переиспользовать поведение.
Go поддерживает принципы ООП, но делает это иначе, без классов и наследования.
Основан на интерфейсах.
Тип считается реализующим интерфейс, если содержит все его методы (утиная типизация).
Пример:
type Speaker interface {
Speak()
}
type Dog struct{}
func (d Dog) Speak() {
fmt.Println("Woof")
}
func makeSpeak(s Speaker) {
s.Speak()
}Контролируется через регистр:
Field — экспортируется.
field — доступен только внутри пакета.
Позволяет использовать методы встроенных полей как свои.
Пример:
type Logger struct{}
func (l Logger) Log(msg string) { fmt.Println(msg) }
type Service struct {
Logger
}
s := Service{}
s.Log("hello")Вывод:
Go реализует ООП через интерфейсы и композицию, что делает систему гибкой и простой в тестировании.