golang中关键字var后面的下划线和接口名称是什么意思?

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行似乎是声明了boolType实现接口ValueConverter,这是否有必要? 我删除了第58行,代码工作正常

它提供了一个静态(编译时间)检查boolType满足ValueConverter接口。 用作variables名称的_告诉编译器有效地丢弃RHS值,但是对其进行types检查并评估它是否有任何副作用,但匿名variables本身不会占用任何进程空间。

开发时这是一个方便的构造,并且接口的方法集和/或types实现的方法经常改变。 这个构造函数可以防止忘记匹配types和接口的方法集合,而这些接口的目的是让它们兼容。 它有效地防止go install一个这样的遗漏破碎(中间)版本。

看起来你正在创build一个ValueConvertertypes的虚拟值,为它分配一个新的boolType对象,然后放弃它(这是下划线的意思,在for _, elt := range myRange { ...}如果你对枚举的索引不感兴趣的话)。

我的猜测是,它只是对应于一个静态检查,以确保struct boolType确实实现了ValueConverter接口。 这样,当你改变boolType的实现时,如果你打破了ValueConverter接口的实现,编译器会提前投诉,因为它将无法将新的boolType到这个接口。