什么是接口断言?

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)

什么是"接口断言"?

Adr*_*ian 8

它将具体类型的nil指针指定给接口类型的变量.这是一种常见的做法,证明了具体类型满足接口 - 如果它不,该行不会编译,给人的具体类型不能分配给该接口的类型和原因的变量的错误.

正如@JimB所说,"界面断言"是一个由作者组成的术语.Go没有这样的术语.具体来说,这是一种类型转换,转换nil为指针tmLogger,然后将类型化的nil指针指定给接口类型的空白标识符变量Logger.如果*tmLogger不满足Logger,则不会编译; 但是,在运行时,这不占用内存,因为它使用的是nil值.

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

考虑到这是一个纯粹的测试实践,我个人把这些检查在_test.go文件,以便他们包括在单元测试执行,从最终的二进制文件,测试套件的明确一部分,而不是应用程序逻辑排除.