Какова взаимосвязь между интерфейсами и структурами в Go? Может ли интерфейс определять поля данных?

Ответ

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


  • Интерфейс (interface) — это тип, который определяет набор методов (сигнатур функций). Он является контрактом на поведение. Любой тип, который реализует все методы интерфейса, неявно удовлетворяет этому интерфейсу.



  • Структура (struct) — это композитный тип, который определяет набор полей (данных, состояния).


Таким образом, интерфейс описывает, что тип должен уметь делать, а структура определяет, из чего он состоит. Структура может реализовать интерфейс, определив для себя все его методы.

Пример:

// Интерфейс определяет ПОВЕДЕНИЕ - способность издавать звук
type Speaker interface {
    Speak() string
}

// Структура определяет СОСТОЯНИЕ - имя собаки
type Dog struct {
    Name string
}

// Структура Dog РЕАЛИЗУЕТ интерфейс Speaker, 
// определив метод Speak().
func (d Dog) Speak() string {
    return "Woof! My name is " + d.Name
}

// Структура Cat также реализует этот интерфейс
type Cat struct {
    IsLazy bool
}

func (c Cat) Speak() string {
    return "Meow..."
}

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

// Пример композиции
type Animal struct {
    Age int
}

type Bird struct {
    Animal // Встраивание Animal в Bird
    CanFly bool
}

b := Bird{}
b.Age = 5 // Поле Age доступно напрямую