什么是接口断言?

时间:2017-07-07 17:48:01

标签: go interface assertion

我刚刚在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 ...

这是什么“界面断言”?

1 个答案:

答案 0 :(得分:7)

它将具体类型的nil指针指定给接口类型的变量。这是一种常见的做法,用于证明具体类型满足接口 - 如果不满足,则该行不会编译,给出错误,即不能将具体类型分配给接口类型的变量以及原因。

正如@JimB所说,“界面断言”是由作者组成的术语。 Go没有这样的术语。具体来说,这是type conversion,将nil转换为指向tmLogger的指针,然后将类型化的nil指针指定给接口类型Logger的{​​{3}}变量。 }。如果*tmLogger不满足Logger,则分配将无法编译;但是,在运行时,这不占用内存,因为它使用的是nil值。

据推测,作者在“断言”的单元测试意义上比“类型断言”意义更多地使用这个术语 - 该行代码断言该类型实现了接口,如果没有,则该行将失败。

鉴于这纯粹是一种测试实践,我个人将这些检查放在_test.go文件中,以便它们包含在单元测试执行中,从最终二进制文件中排除,显然是测试套件的一部分而不是应用程序逻辑。