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

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

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

您似乎正在创建一个类型为ValueConverter的伪值,为其分配一个新的boolType对象,然后丢弃它(这是go中下划线的含义,如果您对枚举的索引不感兴趣,则与for _, elt := range myRange { ...}中一样)。

我的猜测是,它只是对应于一个静态检查,以确保结构体boolType确实实现了ValueConverter接口。这样,当您更改boolType的实现时,如果您破坏了ValueConverter接口的实现,编译器会提前抱怨,因为它将无法将新的boolType强制转换为此接口。

最新更新