Проверка соответствия компиляции интерфейса 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.