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