我刚刚在 this blog post 上看到这段代码
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 ...
什么是“接口(interface)断言”?
最佳答案
它将指向具体类型的 nil 指针分配给接口(interface)类型的变量。这是证明具体类型满足接口(interface)的常见做法 - 如果不满足,则该行将无法编译,并给出无法将具体类型分配给接口(interface)类型变量的错误以及原因。
正如@JimB 指出的那样,“接口(interface)断言”是作者编造的一个术语。 Go 没有这样的术语。这是,具体来说,一个 type conversion ,将 nil
转换为指向 tmLogger
的指针,然后将类型化的 nil 指针分配给 blank identifier接口(interface)类型 Logger
的变量。如果*tmLogger
不满足Logger
,则赋值不会编译;但是,在运行时,这不会占用内存,因为它使用的是 nil 值。
据推测,作者更多地是在“断言”的单元测试意义上使用这个术语,而不是在“类型断言”的意义上——该行代码断言该类型实现了接口(interface),如果没有,该行将失败。
鉴于这纯粹是一种测试实践,我个人将这些检查放在 _test.go 文件中,以便它们包含在单元测试执行中,从最终二进制文件中排除,并且显然是测试套件的一部分而不是应用程序逻辑。
关于go - 什么是接口(interface)断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44976862/