ホームページ >バックエンド開発 >Golang >Golang インターフェイスのアドレス指定不可能な値にアドレスでアクセスできないのはなぜですか?

Golang インターフェイスのアドレス指定不可能な値にアドレスでアクセスできないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-28 06:25:17430ブラウズ

Why Are Non-Addressable Values in Golang Interfaces Not Accessable by Address?

Golang インターフェイスのアドレス指定不可能な値

Golang ドキュメントやコミュニティ フォーラムで広く議論されている Go インターフェイスのアドレス指定不可能な値の概念は、次のような疑問を引き起こします。これらの値にアクセスできないのはなぜですか? address?

Background

MethodSets に関する Go wiki (https://github.com/golang/go/wiki/MethodSets#interfaces) が指摘しているように、「マップ要素がアドレス指定できないのと同じように、インターフェイスもアドレス指定できません。」マップ要素のアドレス指定ができないことは十分に理解されており、関連記事「マップ値がアドレス指定できないのはなぜですか?」で詳しく説明されています。

インターフェイス値のアドレス指定ができない理由

ただし、インターフェイス内の値のアドレス指定ができない根本的な理由はそれほど明確ではありません。なぜ言語設計でこの制限が課されるのでしょうか?

その答えは、型の整合性を維持することにあります。特定の型の値へのポインタは、インターフェイスに割り当てられる場合、その型の値を指す必要があります。ただし、インターフェイスに異なる型の値が含まれる可能性がある場合、異なる型の値がインターフェイスに割り当てられるたびに、ポインタは無効になります。

説明のために、インターフェイス I と、次の 2 つの型 A および B を考えてみましょう。 I:

type I interface{}
type A int
type B string

A の値を I に格納し、その値のアドレスを取得すると、結果のポインターは *A 型になります。ただし、後で B 値を I に代入すると、ポインタは無効になります。

ポインタ レシーバを備えたメソッドに対する影響

インターフェイス値のアドレス指定不可能性は、ポインタを備えたメソッドに直接的な影響を及ぼします。受信機。このようなメソッドは、特定の具象型へのポインターを期待します。インターフェイス内の非ポインター値はアドレス指定できないため、ポインター レシーバーを備えたメソッドに渡すことができず、次のエラーが発生します。

<type> does not implement <interface> (<name> method has pointer receiver)

結論

要約すると、 Go インターフェイスで値のアドレス指定ができない理由は、型の整合性を保護するためです。特定の型の値へのポインタは、常にその型の値を指す必要がありますが、異なる型の値を保持できるインターフェイスに値が格納されている場合、これは保証できません。

以上がGolang インターフェイスのアドレス指定不可能な値にアドレスでアクセスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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