97

来自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 行,代码运行良好。

4

2 回答 2

139

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

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

于 2012-11-02T11:46:52.990 回答
31

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

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

于 2012-11-02T11:47:44.313 回答