Что означает подчеркивание и имя интерфейса после ключевого слова var?

80

Из http://golang.org/src/pkg/database/sql/driver/types.go :

type ValueConverter interface {
    // ConvertValue converts a value to a driver Value.
    ConvertValue(v interface{}) (Value, error)
}

var Bool boolType

type boolType struct{}

var _ ValueConverter = boolType{} // line 58

func (boolType) String() string { return "Bool" }

func (boolType) ConvertValue(src interface{}) (Value, error) {....}

Я знал, что ValueConverter - это имя интерфейса. Строка 58, кажется, объявляет, что boolType реализует интерфейс ValueConverter, но необходимо ли это? Я удалил строку 58, и код работает хорошо.

дилфиш
источник
Пустой идентификатор также _ может использоваться для строгого предоставления ключей в структуре. Смотрите это для справки
Vallie

Ответы:

121

Он обеспечивает статическую (во время компиляции) проверку, boolTypeудовлетворяющую ValueConverterинтерфейсу. _Используются как имя переменного сообщает компилятор для эффективного сброса значения РИТ, но проверять тип его и оценить его , если он имеет какие - либо побочные эффекты, но анонимные переменные сами по себе не несет никакого процесс пространства.

Это удобная конструкция при разработке, и набор методов интерфейса и / или методы, реализованные типом, часто меняются. Конструкция служит защитой от того, чтобы забыть сопоставить наборы методов типа и интерфейса, цель которых - сделать их совместимыми. Это эффективно предотвращает go installпоявление ломаной (промежуточной) версии с таким упущением.

zzzz
источник
27

Похоже, вы создаете фиктивное значение типа ValueConverter, присваивая новоеboolType объект, а затем отбрасываете его (что является значением подчеркивания в go, как for _, elt := range myRange { ...}будто вас не интересует индекс перечисления).

Я предполагаю, что это просто соответствует статической проверке, чтобы убедиться, что структура boolTypeдействительно реализует ValueConverterинтерфейс. Таким образом, когда вы изменяете реализацию boolType, компилятор заранее пожалуется, если вы нарушили реализацию ValueConverterинтерфейса, поскольку он не сможет преобразовать ваш новый boolTypeв этот интерфейс.

вал
источник