我已经阅读了Effective Go and Go Tutorials以及一些来源,但interface {}
语法背后的确切机制是Go对我来说有些神秘。我在尝试实现heap.Interface
时首先看到它,它似乎是某种容器(让我想起一个monad),我可以从中提取任意类型的值。
Go为什么要写这个?是泛型的某种解决方法吗?是否有更优雅的方法从heap.Interface
获取值而不是使用heap.Pop(&h).(*Foo)
取消引用它们(在堆指针类型为Foo的情况下)?
答案 0 :(得分:7)
interface{}
是一个可以容纳所有内容的通用框。 go中的接口定义了一组方法,实现这些方法的任何类型都符合接口。 interface{}
没有定义任何方法,因此根据定义,每个类型都符合此接口,因此可以保存为interface{}
类型的值。
它根本不像泛型。相反,它是放松类型系统的一种方式,并说“任何价值都可以在这里传递”。 C中对于此功能的等价物是void *
指针,除了在Go中,您可以查询所持有的值的类型。
答案 1 :(得分:1)
这是一个很好的blog post,它解释了幕后发生的事情。