ホームページ > バックエンド開発 > Golang > Go 構造体フィールドを変更すると元の値に戻るのはなぜですか?

Go 構造体フィールドを変更すると元の値に戻るのはなぜですか?

Linda Hamilton
リリース: 2024-11-15 15:45:02
オリジナル
841 人が閲覧しました

Why Does My Go Struct Field Revert to Its Original Value When Modified?

Go での構造体フィールドの復帰

Go プログラム内で構造体のフィールドを変更しようとすると、フィールドが元の値に戻ったようです。この問題は、Go で構造体が値によって渡される方法が原因で発生します。

コードでは、MockConnector 構造体に last_command と value という 2 つのフィールドがあります。 MockConnector の sendCommand メソッドは、これらのフィールドを変更します。ただし、TVManager 構造体から manager.sendMessage を呼び出すときは、コネクタ インスタンスを値として渡します。これは、sendCommand が元のコネクタ構造体への参照ではなく、コネクタ構造体のコピーを受け取ることを意味します。

この問題を解決するには、関係する構造体へのポインタを使用する必要があります。構造体へのポインターを渡すことにより、メモリ内の実際の構造体への参照を渡します。これにより、構造体のフィールドを直接変更できるようになります。

修正コード:

func (this *MockConnector) sendCommand(payload map[string]string) {
    fmt.Println("0", this)
    this.last_command = payload
    this.value = true
    fmt.Println("0", this)
}
ログイン後にコピー

MockConnector 構造体へのポインターを受け取るように sendCommand メソッドを変更することで、ここで、単なるコピーではなく、実際のコネクタ インスタンスを変更します。

受信者名:

さらに、これを Go で受信者名として使用しないことがベスト プラクティスと考えられます。構造体メソッド。代わりに、レシーバーの種類を示す、よりわかりやすい名前を使用します。

一貫したメソッド セット:

構造体の 1 つのメソッドにポインター レシーバーが必要な場合は、次のようにすることをお勧めします。その構造体のすべてのメソッドがポインタ レシーバを使用するようにします。これにより、レシーバーが値であるかポインターであるかに関係なく、メソッド セット内の一貫性が確保されます。

これらの推奨事項を適用することで、Go プログラムでフィールド値が元に戻る問題を排除できます。

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

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