什么是接口断言?

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

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

什么是“接口断言”?

回答:

它将指向具体类型的nil指针分配给接口类型的变量。这是证明具体类型满足接口的一种常见做法-

如果不满足,则该行将无法编译,并给出一个错误,即无法将具体类型分配给该接口类型的变量,以及为什么。

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

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

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

以上是 什么是接口断言? 的全部内容, 来源链接: utcz.com/qa/431726.html

回到顶部