【问题标题】:What does an underscore and interface name after keyword var mean?关键字 var 后面的下划线和接口名称是什么意思?
【发布时间】:2012-10-23 01:19:55
【问题描述】:

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

【问题讨论】:

  • 空白标识符_ 也可用于严格提供结构中的键。请参阅this 以供参考

标签: syntax interface go underscores


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多