我刚刚遇到了这段代码
type Logger interface {
Debug(msg string, keyvals ...interface{}) error
Info(msg string, keyvals ...interface{}) error
Error(msg string, keyvals ...interface{}) error
}
type tmLogger struct {
srcLogger kitlog.Logger
}
// Interface assertions
var _ Logger = (*tmLogger)(nil) // What is this?
// ... interface definition ...
这个“接口断言”是什么?
它将一个指向具体类型的 nil 指针分配给接口类型的变量。这是证明具体类型满足接口的常见做法 - 如果不满足,该行将无法编译,并给出错误,指出具体类型无法分配给接口类型的变量以及原因。
正如@JimB 指出的,“接口断言”是作者创造的一个术语。 Go 没有这样的术语。具体来说,这是一个类型转换 https://golang.org/ref/spec#Conversions, 转换nil
指向一个指针tmLogger
,然后将类型化的 nil 指针分配给 a空白标识符 https://golang.org/ref/spec#Blank_identifier接口类型变量Logger
. If *tmLogger
不满足Logger
,作业将无法编译;但是,在运行时,这不占用内存,因为它使用的是 nil 值。
想必作者更多地在“断言”的单元测试意义上使用这个术语,而不是“类型断言”的意义——该行代码断言该类型实现了该接口,如果没有,该行将失败。
鉴于这纯粹是一种测试实践,我个人将这些检查放在 _test.go 文件中,以便它们包含在单元测试执行中,从最终的二进制文件中排除,并且显然是测试套件的一部分,而不是应用程序逻辑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)