#php エディター Baicao は、すべてのメソッドに同じタイプのレシーバーを使用するという公式 Go ガイドの提案に混乱しています。 Go 言語を学習する過程で、メソッドを定義するときにレシーバーの型を一貫させる必要があるという提案によく遭遇します。ただし、この提案には実際の適用においていくつかの疑問が生じます。この提案の意味と目的をより深く理解するために、私たちはそれを深く調査し、合理的な説明を見つけるよう努めます。
Go の公式チュートリアルを通って Go を学ぼうとしていますが、値レシーバーとポインター レシーバーに関するセクションの最後の部分がわかりにくいと思いました。
一般に、特定の型のすべてのメソッドには、値レシーバーまたはポインター レシーバーのいずれかが必要ですが、両方は必要ありません。 (その理由は次の数ページで説明します。)
基本的に、2 つの質問があります:A) この章の残りの部分では 2 つのタイプの受信機を混在させるべきではない理由が見つからないようです。そのため、誰かがこれについて説明しているセクションを説明または引用していただければ幸いです。
B) ポインタと値レシーバを混在させるのは確かに悪い考えだと仮定すると、異なるインターフェイスをどのように実装すればよいでしょうか?たとえば、チュートリアルでは
Stringer と
error という 2 つの異なる組み込みインターフェイスについて説明していることがわかりました。
Stringer に提供されているコードでは値レシーバーが使用されており、ポインター レシーバーへの切り替えは機能していないようですが、
error インターフェイスではポインター レシーバーが使用されています。上記の原則に違反せずに、構造体にこれら 2 つのインターフェイスを実装するにはどうすればよいですか。
###ありがとう!
回避策
SetField
とValueReceiver を同時に呼び出すと、競合が発生します。これは、
SetField がフィールドを書き込むときに、
ValueReceiver がレシーバーのコピーを作成し、明示的な同期なしで同じフィールドが読み取られるためです。
2 番目の質問:
T
T のすべてのインターフェイスを実装します。
このトピックに関する FAQ へのリンクは次のとおりです (@jub0bs に感謝):
https://www.php.cn/link/bcc097feafe80f489ef54b0720ca059c
https://dave.cheney .net/2015/11/18/wednesday-pop-quiz-spot-the-race
以上がすべてのメソッドに同じタイプのレシーバーを使用するという公式 Go ガイドの提案に混乱しているの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。