在关键字“var”后面加下划线和接口名称是什么意思?

110

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行代码,程序仍然可以正常工作。


空白标识符 _ 也可以严格地在结构体中提供键。请参阅此链接了解更多信息。 - Vallie
2个回答

162
它提供了一个静态(编译时)检查,确保boolType符合ValueConverter接口。变量名称中使用的_告诉编译器有效地丢弃RHS值,但要对其进行类型检查并在其具有任何副作用时进行评估,但是匿名变量本身不占用任何进程空间。
当开发接口的方法集和/或类型实现的方法经常更改时,它是一个方便的结构。该结构用作防止忘记匹配类型和接口的方法集的警卫,其中意图是使它们兼容。它有效地防止使用遗漏的版本进行go install

7
https://golang.org/doc/effective_go.html#blank_implements - Jack Liu Shurui
哦,谢谢。我被下面的代码困扰了很久。var _ QueryBuilder = (*selectQueryBuilder)(nil) - Michał Wesołowski

33

看起来你正在创建一个类型为ValueConverter的虚拟值,将一个新的boolType对象分配给它,然后丢弃它(这就是在go中下划线的含义,例如for _, elt := range myRange { ...}如果您不关心枚举的索引)。

我的猜测是,这只是对结构体boolType实现ValueConverter接口进行静态检查的方法。这样,当您更改boolType的实现时,编译器会尽早抱怨,因为它将无法将您的新boolType强制转换为此接口,即无法满足ValueConverter接口的实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接