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

时间:2012-11-02 11:25:01

标签: syntax interface go underscores

来自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 个答案:

答案 0 :(得分:90)

它提供boolType满足ValueConverter接口的静态(编译时)检查。用作变量名称的_告诉编译器有效地丢弃RHS值,但要进行类型检查并评估它是否有任何副作用,但匿名变量本身不会带任何副作用过程空间。

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

答案 1 :(得分:20)

您似乎正在创建类型为ValueConverter的虚拟值,为其分配一个新的boolType对象,然后将其丢弃(这就是go中下划线的含义,如{{ 1}}如果你对枚举的索引不感兴趣。)

我的猜测是它只是对应一个静态检查,以确保struct for _, elt := range myRange { ...}确实实现了boolType接口。这样,当您更改ValueConverter的实现时,如果您破坏了boolType接口的实现,编译器会提前抱怨因为它无法将新的ValueConverter强制转换为此接口。