【问题标题】:What is the role of the "interface {}" syntax in Go?Go 中“interface {}”语法的作用是什么?
【发布时间】:2025-12-27 17:35:15
【问题描述】:

我已经阅读了 Effective Go 和 Go 教程以及一些源代码,但是 interface {} 语法背后的确切机制对我来说有点神秘。我在尝试实现 heap.Interface 时第一次看到它,它似乎是某种容器(让我想起了一个 monad),我可以从中提取任意类型的值。

为什么 Go 被编写来使用它?这是泛型的某种解决方法吗?有没有比使用heap.Pop(&h).(*Foo) 取消引用它们更优雅的方法从heap.Interface 获取值(在堆指针指向Foo 类型的情况下)?

【问题讨论】:

    标签: interface go


    【解决方案1】:

    interface{} 是一个可以容纳所有东西的通用盒子。 Go 中的接口定义了一组方法,任何实现这些方法的类型都符合该接口。 interface{} 没有定义任何方法,因此根据定义,每个类型都符合此接口,因此可以保存在 interface{} 类型的值中。

    它根本不像泛型。相反,这是一种放松类型系统并说“任何值都可以在这里传递”的方法。此功能在 C 中的等价物是 void * 指针,但在 Go 中,您可以查询所保存的值的类型。

    【讨论】:

    • 啊,是匿名类型!收到了。谢谢!我想我会使用某种反射来查询所持有的类型。我还没有与那部分合作过;到目前为止,我只是使用(奇怪,对我来说).(<some type>) 语法来获取值。
    • 有一个反射包可以让你查询类型,或者你可以使用一个类型开关,它看起来类似于一个常规开关,但案例是类型。或者你可以只使用类型断言的非错误版本(例如value, ok := foo.(type)
    【解决方案2】:

    这是一个出色的blog post,它解释了幕后发生的事情。

    【讨论】:

      最近更新 更多