インターフェイス内の値のアドレスの取得
Go プログラミング言語のコンテキストでは、インターフェイスはコントラクトとして機能し、セットを定義します型が実装する必要があるメソッド。値がインターフェイスに割り当てられると、その値はインターフェイス値でラップされます。ただし、インターフェイス値自体は実際の値を格納するのではなく、その値への参照を保持します。
したがって、& 演算子を使用してインターフェイス内の値のアドレスを取得しようとすると、次のとおりエラーが発生します。次のコード スニペット内:
<code class="go">import "container/list" type retry struct{} var el = list.Element{Value: retry{}} p := &el.Value.(retry) // Compilation error: cannot take the address of el.Value.(retry)</code>
このエラーは、インターフェイス内の値がインターフェイス値自体によって所有されており、新しい値が割り当てられるときにそのストレージが再利用される可能性があるという事実に起因します。インターフェイスに。取得したアドレスの値を変更すると、インターフェイスの値に直接影響を与えることになり、これは望ましくないことであり、予期しない動作を引き起こす可能性があります。
この状況に対処するために、利用可能な代替アプローチがあります。
値の代わりにポインターを保存:
インターフェイスに構造体の値を直接保存する代わりに、それらの構造体へのポインターを保存できます。これにより、インターフェイス値が変更された場合でもポインターが有効なままになります。
要素参照を使用する:
もう 1 つのオプションは、含まれる構造への参照として *list.Element 値を渡すことです。これにより、Go の型安全性を侵害することなく、構造体の値への間接的なアクセスが効果的に提供されます。
以上がGo のインターフェイス内の値のアドレスを取得できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。