Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: interface, dependency inversion, package boundaries

Где объявлять интерфейсы в Go и как применять принцип инверсии зависимостей?

Вопрос проверяет опыт работы с интерфейсами.

Короткий ответ

В Go интерфейсы обычно объявляют там, где они потребляются. Сервис описывает интерфейс репозитория, а конкретная реализация живёт в другом пакете. Это ослабляет связность и упрощает тестирование.

Длинный ответ

Идея: модуль «владеет» интерфейсом, описывающим его внешний контракт.

  • Почему так:

  • потребитель лучше знает, какие методы ему нужны;

  • минимальный интерфейс → меньше связностей.

  • Схема:

  • package service:

type OrderRepo interface {
    Create(ctx context.Context, o Order) error
    Find(ctx context.Context, id string) (Order, error)
}
  • package repo/postgres: type PGRepo struct {…} реализует OrderRepo.

  • Плюсы:

  • подмена на фейк/мок в тестах;

  • отсутствие импортных циклов.

  • Вывод: объявляйте интерфейсы в потребителях и внедряйте реализации DI/конструктором.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Golang

    Golang

Ключевые слова

#interface

#dependency inversion

#package boundaries

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.