суббота, 9 февраля 2019 г.

Go FAQ: Как я могу гарантировать, что мой тип удовлетворяет интерфейсу?

Вы можете попросить компилятор проверить, что тип 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() {}

Большая часть кода не использует такие ограничения, так как они ограничивают полезность идеи интерфейса. Иногда, однако, они необходимы для устранения неясностей среди похожих интерфейсов.


Читайте также:


Комментариев нет:

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