go - 什么是接口(interface)断言?

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

什么是“接口(interface)断言”?

最佳答案

它将指向具体类型的 nil 指针分配给接口(interface)类型的变量。这是证明具体类型满足接口(interface)的常见做法 - 如果不满足,则该行将无法编译,并给出无法将具体类型分配给接口(interface)类型变量的错误以及原因。

正如@JimB 指出的那样,“接口(interface)断言”是作者编造的一个术语。 Go 没有这样的术语。这是,具体来说,一个 type conversion ,将 nil 转换为指向 tmLogger 的指针,然后将类型化的 nil 指针分配给 blank identifier接口(interface)类型 Logger 的变量。如果*tmLogger不满足Logger,则赋值不会编译;但是,在运行时,这不会占用内存,因为它使用的是 nil 值。

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

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

关于go - 什么是接口(interface)断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44976862/

相关文章:

go - GOARCH 和 GOOS 在 go toolchain 编译过程中是如何使用的?

java - 自定义泛型解释

go - 在 Golang 中将接口(interface){}转换为结构

node.js - Node.js 中的 AssertionError 定义在哪里?

c++ - isalpha 在 C++ 中导致 "Debug Assertion Failed"

Golang 比较数字

go - 如何从其他函数解析 slice

go - 如何使用 go-playground/validator 编写蛇形案例绑定(bind)标签?

go - 从字符串 golang 中删除转义的双引号

perl - 我可以在 Perl 中创建类似 Java 的接口(interface)吗?