Вы можете попросить компилятор проверить, что тип T реализует интерфейс I, пытаясь присвоить, используя нулевое значение для T или указатель на T, в зависимости от ситуации:
type T struct{}
var _ I = T{} // Проверяем, что T реализует I.
var _ I = (*T)(nil) // Проверяем, что *T реализует I.
Если T (или *T, соответственно) не реализует I, ошибка будет обнаружена во время компиляции.
Если вы хотите, чтобы пользователи интерфейса явно заявили, что они реализуют его, вы можете добавить метод с описательным именем к набору методов интерфейса. Например:
type Fooer interface {
Foo()
ImplementsFooer()
}
Затем тип должен реализовать метод ImplementsFooer, чтобы быть Fooer, четко документируя факт и анонсируя его в godoc.
type Bar struct{}
func (b Bar) ImplementsFooer() {}
func (b Bar) Foo() {}
Большая часть кода не использует такие ограничения, так как они ограничивают полезность идеи интерфейса. Иногда, однако, они необходимы для устранения неясностей среди похожих интерфейсов.
Читайте также:
- Go FAQ: Почему в Go нет наследования типов?
- Go FAQ: Почему в Go нет объявлений "implements"?
- Основы Go: интерфейсы

Комментариев нет:
Отправить комментарий