【问题标题】:What is an interface assertion?什么是接口断言?
【发布时间】:2017-12-12 02:40:04
【问题描述】:

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

这个“接口断言”是什么?

【问题讨论】:

  • 你是对的,“接口断言”不是一个东西,但它也不是一个类型断言。类型断言完全是var.(Type) 形式(如您链接的文档中所示)。这是type conversion。 /迂腐
  • @Adrian:哦,是的,正确,这绝对是一种类型转换,我看了一眼代码,并假设其中有一个 .,因为“断言”一词
  • 是的,称其为接口断言与实际术语过于接近,使其更加混乱。

标签: go interface assertion


【解决方案1】:

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

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

大概作者在“断言”的单元测试意义而不是“类型断言”意义中使用这个术语 - 那行代码断言该类型实现了接口,如果没有,该行将失败。

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

【讨论】:

    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 2020-08-06
    • 2013-02-25
    • 1970-01-01
    • 2018-11-30
    • 2010-10-08
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多