Проверка соответствия компиляции интерфейса golang

Я вижу следующие утверждения из camlistore ( http://code.google.com/p/camlistore/source/browse/pkg/cacher/cacher.go).

var (
        _ blobref.StreamingFetcher = (*CachingFetcher)(nil)
        _ blobref.SeekFetcher      = (*CachingFetcher)(nil)
        _ blobref.StreamingFetcher = (*DiskCache)(nil)
        _ blobref.SeekFetcher      = (*DiskCache)(nil)
)

Я понимаю, что переменные не создаются, и эти операторы обеспечивают проверку компилятором того, что CachingFether реализует открытые функции StreamingFetcher и SeekFetcher. Часть RHS использует синтаксис конструктора указателя с параметром nil. Что означает этот синтаксис в языке Go?

1 ответ

Решение

(*T)(nil) конверсия В этом случае это означает типизированный ноль, т.е. то же значение, которое, например,

var p *T

прежде чем назначить что-либо на него.

Стандартный синтаксис преобразования T(expr), но приоритет * связал бы это неправильно в

*T(expr)

Этот синтаксис означает разыменование возвращаемого значения функции T с одним аргументом expr, Вот почему преобразование имеет альтернативный синтаксис:

(T)(expr)

где T конечно может быть *U, Следовательно

(*U)(expr)

это обобщенная форма того, что вы видите в хранилище Camlistore.

Другие вопросы по тегам