2011-02-08 10 views
5

私はEffective GoとGoチュートリアルといくつかのソースを読んだことがありますが、interface {}構文の背後にある正確なメカニズムはGoですが、やや神秘的です。私は最初にheap.Interfaceを実装しようとしていましたが、それは何らかの種類のコンテナであるように思われます(少しモナドを思い出させます)。Goの "interface {}"構文の役割は何ですか?

Goがこれを使用する理由は何ですか?ジェネリックの回避策ですか? heap.Pop(&h).(*Foo)(Foo型のヒープポインタの場合)で逆参照するよりも、heap.Interfaceの値を取得するよりエレガントな方法はありますか?

答えて

7

interface{}は、すべてを保持できる一般的なボックスです。 goのインタフェースは一連のメソッドを定義し、これらのメソッドを実装するすべての型はインタフェースに準拠しています。 interface{}にはメソッドが定義されていないため、定義上、すべての単一タイプはこのインターフェイスに準拠しているため、タイプinterface{}の値に保持できます。

ジェネリック医薬品はまったく好きではありません。代わりに、それは型システムを緩和し、「すべての値をここに渡すことができる」と言う方法です。この機能のためのCの同等物はvoid *ポインターですが、Goでは保持されている値のタイプを照会することができます。

+0

ああ、それは匿名のタイプです!それを持って、ありがとう!私は保持されているタイプを照会するために何らかの反射を使用すると思います。私はまだその部分で働いていない。これまでは(奇数、私に) '()'構文を使用して値を戻しました。 –

+0

タイプを照会できるようにするリフレクションパッケージがあります。通常のスイッチと似たタイプスイッチを使用できますが、ケースはタイプです。あるいは、タイプアサーションのエラーのないバージョンを使用することもできます(例えば 'value、ok:= foo。(type)')。 –

1

ここには、フードの下で何が起こっているのかを説明する素晴らしいblog postがあります。

関連する問題