S - один класс/тип одна ответственность; в Go маленькие интерфейсы и пакеты. O - открыт для расширения, закрыт для изменения; интерфейсы и внедрение зависимостей. L - подтипы заменяемы; в Go нет наследования, но интерфейсы должны быть реализуемы так, чтобы клиент не зависел от конкретной реализации. I - узкие интерфейсы (io.Reader, io.Writer). D - зависимость от абстракций (интерфейсов), не от конкретных типов.
type UserRepository interface { GetByID(ctx context.Context, id int64) (*User, error) }
type Service struct { repo UserRepository }