2012-11-22 9 views
112

私はちょうどGo tourで作業していますが、私はポインタとインターフェイスについて混乱しています。なぜこのGoコードはコンパイルされませんか?* *構造体を*インタフェースに割り当てることができないのはなぜですか?

package main 

type Interface interface {} 

type Struct struct {} 

func main() { 
    var ps *Struct 
    var pi *Interface 
    pi = ps 

    _, _ = pi, ps 
} 

すなわちStructInterfaceであれば、なぜ*Struct*Interfaceのではないでしょうか?

私が取得エラーメッセージは次のとおりです。

prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment: 
     *Interface is pointer to interface, not interface 
+1

インタフェースは暗黙のポインタのように振る舞うことができようも参照http://stackoverflow.com/q/20874798/260805 – Ztyx

+0

それが見える... – Victor

+0

は、私が豊かに提案することを使用する必要があります。 'FUNCメイン(私は \tをインタフェース){ \tのvar PS *構造体=新しい(構造体) \tのvarパイ*インタフェース \t VAR私はpsの \tパイを= =&I \tであなたの遊び場\t i = * ps \t fmt.Printf( "%v、%v、%v \ n"、*、%v、%v、%v、%v、 ps、pi、i) \t _、_ = i、pi、ps } 'あなた自身の賛美をしてください。 – Victor

答えて

150

インターフェイスを実装する構造体がある場合、その構造体へのポインタは自動的にそのインタフェースも実装します。そのため、関数のプロトタイプには*SomeInterfaceがありません。これはSomeInterfaceに何も追加しないため、変数宣言にそのような型は必要ありません(this related question参照)。

インターフェイスの値は具体的な構造体の値ではありません(可変サイズのため、これは不可能です)。ポインタの種類です(より正確には構造体へのポインタと型へのポインタ)。ラスCoxは正確hereを説明:

インタフェース値はインタフェースに格納されているタイプと 関連するデータへのポインタに関する情報へのポインタ を与える2ワード対として表されます。

enter image description here

Interfaceとしない*InterfaceInterfaceの実装構造体へのポインタを保持するための正しいタイプである理由です。

だから、あなたは、単に

var pi Interface 
+7

OK、それは私にとって意味があると思います。私はちょうどなぜ(その場合)、 'var pi * Interface'と言うのはコンパイル時のエラーではないかと思っています。 –

+1

私は詳細を説明しました。編集を参照してください。私はリンクしているRuss Coxの記事を読むことをお勧めします。 –

+0

@SimonNickerson:異なるタイプのポインタは互換性がありません。そうであれば、インタフェースポインタを使用して、インタフェースを実装する任意の型の値を上書きすることができます。これは明らかにうまくいきません。 – newacct

3

これは、あなたが何を意味するのか、おそらくです:

package main 

type Interface interface{} 

type Struct struct{} 

func main() { 
     var ps *Struct 
     var pi *Interface 
     pi = new(Interface) 
     *pi = ps 

     _, _ = pi, ps 
} 

はOKコンパイルします。 hereも参照してください。

関連する問題