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

С 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 и код работает хорошо.

2 ответа

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

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

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

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

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