これが不可能な理由を理解するには、インターフェイス変数が実際に何であるかを考えると役に立ちます。インターフェイス値は 2 つの単語を使用し、最初の単語は含まれる値の型を記述し、2 番目の単語は (a) 含まれる値を保持するか (単語内に収まる場合)、または (b) 値のストレージへのポインター (値が単語に収まらない場合)。
注意すべき重要な点は、(1) 含まれる値がインターフェース変数に属していること、および (2) 新しい値が変数に割り当てられたときにその値のストレージが再利用される可能性があることです。それを知って、次のコードを検討してください。
var v interface{}
v = int(42)
p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42
v = &SomeStruct{...}
現在、整数のストレージはポインターを保持するために再利用されており*p
、そのポインターの整数表現になっています。これがどのように型システムを破る可能性があるかを見ることができるので、Go はこれを行う方法を提供していません (unsafe
パッケージを使用する以外)。
リストに格納している構造体へのポインターが必要な場合、構造体の値を直接格納するのではなく、リスト内の構造体へのポインターを格納することが 1 つのオプションになります。*list.Element
または、含まれている構造への参照として値を渡すこともできます。