2011-02-08 20 views
5

我已閱讀Effective Go and Go教程以及一些源代碼,但interface {}語法背後的確切機制是G​​o對我來說有點神祕。我第一次在試圖實現heap.Interface時看到它,它似乎是某種類型的容器(讓我想起一個monad),從中我可以提取任意類型的值。Go中的「interface {}」語法的作用是什麼?

爲什麼Go編寫使用它?對泛型是否有一種解決方法?有一種更優雅的方式來從heap.Interface獲取值,而不是使用heap.Pop(&h).(*Foo)(在堆指針指向Foo類型的情況下)將它們解除引用?

回答

7

interface{}是一個可以容納一切的通用盒子。 go中的接口定義了一組方法,並且實現這些方法的任何類型都符合接口。 interface{}沒有定義方法,因此根據定義,每種類型都符合此接口,因此可以保存在類型爲interface{}的值中。

這不是真的像泛型一樣。相反,這是放鬆類型系統的一種方式,並說「任何價值都可以在這裏傳遞」。在C中,這個功能的等價物是一個void *指針,除了Go以外,您可以查詢被保存的值的類型。

+0

啊,這是一個匿名類型!收到了。謝謝!我想我會使用某種反射來查詢所持有的類型。我還沒有與那部分工作;到目前爲止,我只使用了(奇數,對我)`。()`語法來取回值。 – 2011-02-08 23:22:42

1

下面是一個很好的blog post,它解釋了引擎蓋下正在發生的事情。