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