Pat*_*ryk 0 interface go assertion
我刚刚在这篇博文中看到了这段代码
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 ...
Run Code Online (Sandbox Code Playgroud)
什么是"接口断言"?
它将具体类型的nil指针指定给接口类型的变量.这是一种常见的做法,证明了具体类型满足接口 - 如果它不,该行不会编译,给人的具体类型不能分配给该接口的类型和原因的变量的错误.
正如@JimB所说,"界面断言"是一个由作者组成的术语.Go没有这样的术语.具体来说,这是一种类型转换,转换nil为指针tmLogger,然后将类型化的nil指针指定给接口类型的空白标识符变量Logger.如果*tmLogger不满足Logger,则不会编译; 但是,在运行时,这不占用内存,因为它使用的是nil值.
据推测,作者在"断言"的单元测试意义上比"类型断言"意义更多地使用这个术语 - 该行代码断言该类型实现了接口,如果没有,则该行将失败.
考虑到这是一个纯粹的测试实践,我个人把这些检查在_test.go文件,以便他们包括在单元测试执行,从最终的二进制文件,测试套件的明确一部分,而不是应用程序逻辑排除.