ホームページ  >  記事  >  バックエンド開発  >  インターフェイスされた値へのポインターを取得すると例外が発生するのはなぜですか?

インターフェイスされた値へのポインターを取得すると例外が発生するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-28 19:18:02210ブラウズ

Why Does Retrieving Pointers to Interfaced Values Raise an Exception?

インターフェイスされた値へのポインターの取得

インターフェイス内に格納されている値へのポインターを取得しようとすると、次のように例外が発生する可能性があります。以下のコード:

<code class="go">import "container/list"

type retry struct{}

el := list.New().PushBack(retry{})
p := &el.Value.(retry)</code>

これにより、el.Value.(retry) のアドレスを取得できないことを示すエラーが発生します。この動作は構造体に限定されません。これは、インターフェイスに格納されているすべての型に適用されます。

インターフェイス値の表現について

この制限を理解するには、インターフェイス値の内部表現を考慮してください。これは 2 つの単語で構成されます:

  • 最初の単語には、含まれる値の型情報が含まれます。
  • 2 番目の単語は、値自体 (単語内に収まる場合) を格納するか、またはそのストレージへのポインター (値がワード サイズを超える場合)。

重要なことに、含まれる値はインターフェイス変数によって所有されます。さらに、この値のストレージは、新しい値がインターフェイスに割り当てられるときに再利用される場合があります。

許容ポインタ取得の結果

これらの原則を理解して、次の点を考慮してください。 code:

<code class="go">var v interface{}
v = int(42)
p := GetPointerToInterfaceValue(&v) // a pointer to an integer holding 42
v = &SomeStruct{...}</code>

ここでは、整数に使用されるストレージが、構造体へのポインターを保持するために再利用されています。その結果、*p を逆参照すると、SomeStruct へのポインターの整数表現が生成されるようになりました。この動作は型システムを損なう可能性があります。

代替解決策

この問題を回避するには、構造体自体ではなく構造体へのポインタをリストに格納することを検討してください。あるいは、含まれる構造への参照として *list.Element 値を渡すこともできます。

以上がインターフェイスされた値へのポインターを取得すると例外が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。