2013-08-01 4 views
3

Я вижу следующие высказывания из camlistore (http://code.google.com/p/camlistore/source/browse/pkg/cacher/cacher.go).golang соответствие требованиям проверка типа компиляции

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

+0

Мне любопытно, почему эта проверка необходима. Мне кажется, что если они когда-либо были/использованы/эти значения, компилятор выполнит чек? Единственное объяснение, о котором я могу думать, это то, что они используют пакет 'unsafe', и они собираются выполнять неконтролируемые операции, которые они хотят, чтобы компилятор все равно проверял. Но они не импортируют 'unsafe' в этот файл. Есть идеи? – joshlf

+0

Это статическое (время компиляции), если тип RHS удовлетворяет интерфейсу LHS. При такой проверке компилятор немедленно отклоняет случайное изменение набора методов RHS. – zzzz

ответ

5

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

var p *T 

перед тем, как присвоить ему что-либо.

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

*T(expr) 

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

(T)(expr) 

где T, конечно, может быть *U. Поэтому

(*U)(expr) 

- обобщенная форма того, что вы видите в репозитории Camlistore.