ホームページ >バックエンド開発 >Golang >すべてのメソッドに同じタイプのレシーバーを使用するという公式 Go ガイドの提案に混乱している

すべてのメソッドに同じタイプのレシーバーを使用するという公式 Go ガイドの提案に混乱している

PHPz
PHPz転載
2024-02-10 10:42:08711ブラウズ

对 Go 官方指南中关于所有方法使用相同类型接收器的建议感到困惑

#php エディター Baicao は、すべてのメソッドに同じタイプのレシーバーを使用するという公式 Go ガイドの提案に混乱しています。 Go 言語を学習する過程で、メソッドを定義するときにレシーバーの型を一貫させる必要があるという提案によく遭遇します。ただし、この提案には実際の適用においていくつかの疑問が生じます。この提案の意味と目的をより深く理解するために、私たちはそれを深く調査し、合理的な説明を見つけるよう努めます。

質問の内容

Go の公式チュートリアルを通って Go を学ぼうとしていますが、値レシーバーとポインター レシーバーに関するセクションの最後の部分がわかりにくいと思いました。

一般に、特定の型のすべてのメソッドには、値レシーバーまたはポインター レシーバーのいずれかが必要ですが、両方は必要ありません。 (その理由は次の数ページで説明します。)

基本的に、2 つの質問があります:

A) この章の残りの部分では 2 つのタイプの受信機を混在させるべきではない理由が見つからないようです。そのため、誰かがこれについて説明しているセクションを説明または引用していただければ幸いです。

B) ポインタと値レシーバを混在させるのは確かに悪い考えだと仮定すると、異なるインターフェイスをどのように実装すればよいでしょうか?たとえば、チュートリアルでは

Stringererror という 2 つの異なる組み込みインターフェイスについて説明していることがわかりました。 Stringer に提供されているコードでは値レシーバーが使用されており、ポインター レシーバーへの切り替えは機能していないようですが、error インターフェイスではポインター レシーバーが使用されています。上記の原則に違反せずに、構造体にこれら 2 つのインターフェイスを実装するにはどうすればよいですか。

値レシーバーとポインター レシーバーを使用することの欠点 (オブジェクトの作成など)、および一貫性の重要性 (この質問から) について同様の質問を調べたことに注意してください。 Go では、これらを公式 Go ツアーの情報/例と組み合わせてみました。

###ありがとう!

回避策

最初の問題については、値レシーバーとポインター レシーバーの両方があると、値レシーバーがオブジェクトをコピーするため、微妙な競合が発生する可能性があります。例えば:### リーリー

上記の例では、

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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。