一尘不染

什么是接口断言?

go

我刚刚在这篇博客文章中遇到了这段代码

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 ...

什么是“接口断言”?


阅读 1127

收藏
2020-07-02

共1个答案

一尘不染

它将指向具体类型的nil指针分配给接口类型的变量。这是证明具体类型满足接口的一种常见做法-
如果不满足,则该行将无法编译,并给出一个错误,即无法将具体类型分配给该接口类型的变量,以及为什么。

正如@JimB指出的那样,“接口断言”是由作者组成的术语。Go没有这样的术语。具体来说,这是类型转换,先转换nil为的指针tmLogger,然后将类型化的nil指针分配给接口类型的空白标识符变量Logger。如果*tmLogger不满足Logger,任务将无法编译;但是,在运行时,由于使用的是nil值,因此不会占用任何内存。

大概作者在“断言”的单元测试意义上比“类型断言”意义更多地使用了该术语-该行代码断言该类型实现了接口,否则,该行将失败。

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

2020-07-02