В чем разница инверсии зависимостей в Go и языками на ООП

«В чем разница инверсии зависимостей в Go и языками на ООП» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые отличия:

  1. Интерфейсы неявные – в Go тип автоматически удовлетворяет интерфейсу, если реализует его методы (утиная типизация).
  2. Нет конструкторов – DI часто реализуется через передачу зависимостей вручную или с помощью контейнеров (например, wire).
  3. Композиция вместо наследования – зависимости внедряются через встраивание структур.

Пример:

type Logger interface {
    Log(message string)
}

type Service struct {
    logger Logger
}

func NewService(logger Logger) *Service {
    return &Service{logger: logger}
}

В ООП (например, Java/C#):

  • DI часто использует аннотации (@Inject).
  • Зависимости могут разрешаться автоматически через IoC-контейнеры.
  • Интерфейсы явно объявляются для классов.