ホームページ > バックエンド開発 > Golang > メソッド呼び出し後に Go 構造体フィールドが元に戻るのはなぜですか?

メソッド呼び出し後に Go 構造体フィールドが元に戻るのはなぜですか?

DDD
リリース: 2024-11-15 05:48:02
オリジナル
367 人が閲覧しました

Why Does My Go Struct Field Revert After a Method Call?

構造体フィールドの復帰

提供された Go コードでは、メソッド内で構造体フィールドが変更されたにもかかわらず、そのメソッド内に戻るという奇妙な動作が観察されます。後で確認すると元の値になります。この問題は、構造体が ポインタ ではなく で渡されるという事実に起因します。

説明:

TVManager 構造体の sendMessage メソッドで、コネクタ構造体の sendCommand メソッドが、 TVManager 構造体。構造体が値によって渡される場合、構造体の コピー が作成され、元の構造体への参照の代わりに渡されます。

MockConnector 構造体の sendCommand メソッドでは、コネクタ構造体 (last_command、value など) が変更されます。ただし、コネクタは値によって渡されるため、変更は元の構造体ではなく、構造体の コピー にのみ適用されます。

この問題を解決するには、 sendCommand メソッドは、値ではなくポインタで渡される必要があります。これにより、メソッドはコピーではなく、元のコネクタ構造体を変更できるようになります。

解決策:

置換:

func (this MockConnector) sendCommand(payload map[string]string)
ログイン後にコピー

次:

func (this *MockConnector) sendCommand(payload map[string]string)
ログイン後にコピー

追加考慮事項:

  • 一般に、Go で "this" をレシーバー名として使用することは推奨されません
  • 指定された型の 1 つのメソッドがポインタ レシーバを使用する場合、その すべて メソッドにポインタ レシーバを使用することがベスト プラクティスです。
と入力します。

以上がメソッド呼び出し後に Go 構造体フィールドが元に戻るのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート