Ответ
В Go инверсия зависимостей (DI) достигается через интерфейсы и композицию, а не через наследование, как в классических ООП языках.
Ключевые отличия:
- Интерфейсы неявные – в Go тип автоматически удовлетворяет интерфейсу, если реализует его методы (утиная типизация).
- Нет конструкторов – DI часто реализуется через передачу зависимостей вручную или с помощью контейнеров (например,
wire). - Композиция вместо наследования – зависимости внедряются через встраивание структур.
Пример:
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-контейнеры.
- Интерфейсы явно объявляются для классов.