1. ホーム
  2. go

[解決済み] なぜ、*Structを*Interfaceに割り当てることができないのですか?

2022-04-28 13:20:30

質問

をやっているところです。 ツアーに行く ポインターとインターフェースについて混乱しています。なぜこの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

解決方法は?

あるインターフェースを実装した構造体がある場合、その構造体へのポインタは自動的にそのインターフェースも実装しています。そのため *SomeInterface に何も付け加えられないので、関数のプロトタイプの中で SomeInterface また、変数宣言ではこのような型は必要ありません ( この関連質問 ).

インターフェース値は具象構造体の値ではなく、一種のポインターです(正確には構造体へのポインターと型へのポインターの2つです)。Russ Cox はこのことを正確に説明しています。 こちら :

インターフェイスの値は、2つの単語のペアで表され、そのポインタは へのポインタと、インターフェイスに格納された型に関する情報へのポインタがあります。 関連するデータ

このため Interface でなく *Interface を実装した構造体へのポインタを保持するための正しい型です。 Interface .

そのため、単純に

var pi Interface