关键字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行,代码运行良好。


HUH函数
浏览 241回答 2
2回答

蝴蝶刀刀

它提供boolType满足ValueConverter接口的静态(编译时)检查。将_用作变量的名称告诉编译器有效地丢弃的RHS值,但类型检查和评估,如果有任何的副作用,但本身的匿名变量不采取任何进程空间。在开发中并且接口的方法集和/或由类型实现的方法经常更改时,这是一个方便的构造。该构造可以防止忘记匹配类型和接口的方法集,以使它们兼容。它有效地避免go install了由于这种遗漏而导致版本(中间)损坏的情况。

慕尼黑的夜晚无繁华

好像您正在创建一个type的虚拟值,为其ValueConverter分配一个新boolType对象,然后将其丢弃(这是go中下划线的含义,就像for _, elt := range myRange { ...}您对枚举的索引不感兴趣一样)。我的猜测是,它仅与静态检查相对应,以确保该结构boolType确实实现了该ValueConverter接口。这样,当您更改的实现时boolType,如果您中断了ValueConverter接口的实现,则编译器将提早投诉,因为它将无法将新的类型boolType转换为该接口。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go