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


79

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

Answers:


116

它提供boolType满足ValueConverter接口的静态(编译时)检查。将_用作变量的名称告诉编译器有效地丢弃的RHS值,但类型检查和评估,如果有任何的副作用,但本身的匿名变量不采取任何进程空间。

在开发中并且接口的方法集和/或由类型实现的方法经常更改时,这是一个方便的构造。该构造可以防止忘记匹配类型和接口的方法集,以使它们兼容。它有效地避免go install了由于这种遗漏而导致的版本(中间)损坏。


27

似乎您正在创建一个type的虚拟值,向其ValueConverter分配一个新boolType对象,然后将其丢弃(这是go中下划线的含义,就像for _, elt := range myRange { ...}您对枚举的索引不感兴趣一样)。

我的猜测是,它仅与静态检查相对应,以确保该结构boolType确实实现了ValueConverter接口。这样,当您更改的实现时boolType,如果您中断了ValueConverter接口的实现,则编译器将提早投诉,因为它将无法将新的类型boolType转换为该接口。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.