【问题标题】:Is this a special form of Go type assertion?这是 Go 类型断言的一种特殊形式吗?
【发布时间】:2017-11-02 18:59:06
【问题描述】:

我是一名 Go 程序员新手。

我在 Kubernetes 源代码中遇到过这个:

var (
  _ = Queue(&FIFO{}) // FIFO is a Queue
)

Queue 之前声明如下:

type Queue interface { // etc.

FIFO 之前声明如下:

type FIFO struct { // etc.

那么我的第一个摘录是一种类型断言吗?它似乎不符合the Go Tour's lesson-let on the subject 描述的语法。

我当然可以相信这个块确保FIFO“是”Queue,但我想确切地了解这里发生了什么,而且我太新手了,不知道在哪里查看Go language specification(section on type assertions,这似乎是语义上的内容,似乎没有涵盖这种情况,section on interface types 也没有)。

【问题讨论】:

标签: go syntax


【解决方案1】:

这是一个Type Conversion,与类型断言有点不同。

【讨论】:

  • 谢谢。对于任何其他新手:从规范看来,Queue(&FIFO{}) 在我的 Go 新手眼中看起来像是某种奇怪的函数调用,应该等同于 (Queue)(&FIFO{}),它看起来更像是一种类型转换的构造我更容易理解这里发生了什么。
  • 此外,看起来这本质上是在扮演一个断言的角色:它有效地确保了 FIFO struct,无论维护者对它做什么,都将始终是“可转换的” " 到Queue。
  • 是的,这在功能上是一个编译时断言。通过将结构转换为接口,它会进行编译时检查以确保结构满足接口,而不是在运行时简单地在运行时恐慌并破坏该接口实现。这是确保您的类型满足您认为的接口的推荐方法之一。另一种选择是将结构返回为相关接口的构造函数,具有相同的编译时效果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2021-08-13
  • 2013-06-12
  • 1970-01-01
相关资源
最近更新 更多