我刚刚在这篇博客文章中遇到了这段代码
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值,因此不会占用任何内存。
nil
tmLogger
Logger
*tmLogger
大概作者在“断言”的单元测试意义上比“类型断言”意义更多地使用了该术语-该行代码断言该类型实现了接口,否则,该行将失败。
鉴于这纯粹是测试实践,因此我个人将这些检查放在_test.go文件中,以便将它们包含在单元测试执行中,从最终二进制文件中排除,并且显然是测试套件的一部分,而不是应用程序逻辑。