我刚刚在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 ...
这是什么“界面断言”?
答案 0 :(得分:7)
它将具体类型的nil指针指定给接口类型的变量。这是一种常见的做法,用于证明具体类型满足接口 - 如果不满足,则该行不会编译,给出错误,即不能将具体类型分配给接口类型的变量以及原因。
正如@JimB所说,“界面断言”是由作者组成的术语。 Go没有这样的术语。具体来说,这是type conversion,将nil
转换为指向tmLogger
的指针,然后将类型化的nil指针指定给接口类型Logger
的{{3}}变量。 }。如果*tmLogger
不满足Logger
,则分配将无法编译;但是,在运行时,这不占用内存,因为它使用的是nil值。
据推测,作者在“断言”的单元测试意义上比“类型断言”意义更多地使用这个术语 - 该行代码断言该类型实现了接口,如果没有,则该行将失败。
鉴于这纯粹是一种测试实践,我个人将这些检查放在_test.go文件中,以便它们包含在单元测试执行中,从最终二进制文件中排除,显然是测试套件的一部分而不是应用程序逻辑。