Go では、インターフェイスは型が実装する必要があるメソッドのセットを表します。インターフェイスによって宣言されたメソッドを型が実装すると、その型がそのインターフェイスに参加できることを意味します。
インターフェイス インスタンスに特定の型の値を格納するには、型埋め込みの概念が含まれます。インターフェイス値は、埋め込み型の値と型定義へのポインターの 2 つのコンポーネントで構成されます。
次の例を考えてみましょう。
<code class="go">import "container/list" type Retry struct{} func main() { el := list.New().Front() el.Value = Retry{} p := &el.Value.(Retry) // Attempt to take the address of the embedded value }</code>
ただし、エラーが発生する可能性があります。
cannot take the address of el.Value.(Retry)
エラーについて
このエラーは、Go がインターフェイス内に埋め込まれた値のアドレスの取得を禁止しているために発生します。この制限は、Go がインターフェイス値を管理する方法に起因します。
インターフェイス変数が作成されると、2 ワードのメモリが割り当てられます。最初のワードには埋め込み値の型情報が格納され、2 番目のワードにはサイズに応じて値自体または値へのポインタが含まれます。
インターフェイス変数に新しい値を割り当てると、ストレージが再利用される可能性があります。前の値に割り当てられます。このメカニズムにより効率的なメモリ管理が保証されますが、埋め込まれた値のアドレスを取得しようとすると課題が生じます。ストレージが新しい値に再利用される場合、前の値へのポインタは無効になります。
結果と代替
この制限には重大な影響があります:
埋め込み値のアドレスを指定するには、次の代替案を検討してください:
以上がGo インターフェース内に埋め込まれた値のアドレスを取得できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。