Вы можете попросить компилятор проверить, что тип 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: интерфейсы
Комментариев нет:
Отправить комментарий