❓ Какие знаете бест практис по использованию интерфейсов1. Чем
меньше методов в интерфейсе — тем лучше. Классический пример —
io.Reader
и
io.Writer
.
Один метод, зато супер
универсально.
type Stringer interface {
String() string
}
2.
Принимать интерфейсы, а
возвращать конкретные типы.
Это удобно и для тестов, и для читаемости. Функция, которая что-то использует, пусть
принимает интерфейс, а фабрика или конструктор
возвращает конкретный тип.
func Process(r io.Reader) error { ... } // принимаем интерфейс
func NewBuffer() *bytes.Buffer { ... } // возвращаем структуру
3. Не создавать интерфейсы
на будущее. Если абстракция сейчас не нужна — лучше оставить конкретный тип, иначе код будет сложнее без пользы.
4.
Переиспользовать стандартные интерфейсы, если они подходят. В стандартной библиотеке уже много хороших примеров —
error
,
fmt.Stringer
,
context.Context
.
5.
Осторожно с
interface{}
. Это, по сути,
отключение типизации. Если нужен универсальный контейнер — ок, но в остальном лучше обойтись
конкретными интерфейсами или дженериками.
🐸 Библиотека Go для собеса