Зависимости передаются извне (через конструктор или опции), не создаются внутри типа. В Go: NewService(repo UserRepository, logger Logger) *Service; repo и logger - интерфейсы. Тестирование - подмена моками. Без DI-контейнера вручную собирают граф в main или init. Вариант - functional options: NewService(opts ...Option), WithRepo(r), WithLogger(l).
func NewService(repo UserRepository, log Logger) *Service {
return &Service{repo: repo, log: log}
}
// test
svc := NewService(mockRepo, noopLogger)