什么是接口断言?
我刚刚在这篇博客文章中遇到了这段代码
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没有这样的术语。具体来说,这是类型转换,先转换nil
为的指针tmLogger
,然后将类型化的nil指针分配给接口类型的空白标识符变量Logger
。如果*tmLogger
不满足Logger
,任务将无法编译;但是,在运行时,由于使用的是nil值,因此不会占用任何内存。
大概作者在“断言”的单元测试意义上比“类型断言”意义更多地使用了该术语-该行代码断言该类型实现了接口,否则,该行将失败。
鉴于这纯粹是测试实践,因此我个人将这些检查放在_test.go文件中,以便将它们包含在单元测试执行中,从最终二进制文件中排除,并且显然是测试套件的一部分,而不是应用程序逻辑。
以上是 什么是接口断言? 的全部内容, 来源链接: utcz.com/qa/431726.html