Что это за объявление переменной с подчеркиванием, встроенным интерфейсом и назначением?

Что делает этот фрагмент кода Go?

var _ interface {
    add(string) error
} = &watcher{}

Я считаю, что &watcher{} возвращает две вещи, первая отбрасывается, а вторая назначается ... интерфейсу? Я нашел код в fswatch на Github.


person harm    schedule 07.01.2013    source источник
comment
Это больше похоже на статическую проверку структурного типа - например. он не сможет скомпилироваться (сбой раньше, сбой быстро), если будет предпринята попытка присвоения несовместимого типа. Я не верю, что происходит какая-либо распаковка. (Но я не использую Go.)   -  person    schedule 07.01.2013
comment
см. stackoverflow.com/a/50414917/1153938   -  person Vorsprung    schedule 05.11.2018


Ответы (1)


Эта конструкция объявит переменную с именем пустого идентификатора с типом, заданным литералом типа; определение интерфейса в этом случае. Далее следует выражение инициализатора — в данном случае указатель на составной литерал.

Общая функциональность фрагмента заключается в том, чтобы статически гарантировать, что *watcher удовлетворяет указанному интерфейсу, поскольку переменная _ никоим образом не материализуется, и можно наблюдать только любые возможные побочные эффекты инициализатора. Либо статический (как в этом случае), либо динамический (например, вызов функции, которая во время выполнения назначает, скажем, некоторые глобальные переменные, регистрирует обработчик и т. д.)

person zzzz    schedule 07.01.2013