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

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

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

54  var Bool boolType
55  
56  type boolType struct{}
57  
58  var _ ValueConverter = boolType{}
59  
60  func (boolType) String() string { return "Bool" }
61  
62  func (boolType) ConvertValue(src interface{}) (Value, error) {....}

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

Ответ 1

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

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

Ответ 2

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

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