Что означает символ подчеркивания и интерфейса после ключевого слова 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
в этот интерфейс.