В Go DI чаще делают вручную: зависимости описываются интерфейсами. Конструктор принимает интерфейсы (репозиторий, логгер, клиент API). Конкретные реализации создаются в main и передаются в конструкторы.
type OrderRepo interface {
Save(ctx context.Context, o *Order) error
}
type OrderService struct { repo OrderRepo }
func NewOrderService(repo OrderRepo) *OrderService {
return &OrderService{repo: repo}
}В тесте передается NewOrderService(mockRepo). Фреймворки вроде wire или fx лишь автоматизируют сборку графа зависимостей.