ホームページ  >  記事  >  バックエンド開発  >  Go で構造体フィールドが予期せず元に戻るのはなぜですか?

Go で構造体フィールドが予期せず元に戻るのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-17 07:15:03142ブラウズ

Why Does My Struct Field Revert Unexpectedly in Go?

構造体フィールドが予期せず元に戻る

Go では、構造体は値によって渡されます。つまり、関数内で構造体に加えられた変更は元の構造体には反映されません。これは、提供されたコードで明らかです。メソッド内で値が変更されたように見えても、構造体フィールドが元の値に戻ります。

問題は、構造体がメソッドに渡される方法にあります。指定されたコードでは、TVManager メソッド sendMessage() がコネクタ フィールドのコピーを変更しており、メソッド内で行われた変更は元の構造体に反映されません。

これを修正するには、メソッドで次を使用する必要があります。ポインタ受信機。レシーバーの前にアスタリスク (*) を付けると、メソッドは実際の構造体インスタンスへのポインターを受け取り、メソッド内で行われた変更は元の構造体に適用されます。

func (this *TVManager) sendMessage(message string) {
    fmt.Println("5", this.connector)
    payload := map[string]string{
        "id":    "0",
        "type":  "request",
        "uri":   "ssap://system.notifications/createToast",
        "payload": "{'message': 'This is a message'}",
    }
    this.connector.sendCommand(payload)
    fmt.Println("4", this.connector)
}

同様に、モック オブジェクトの場合、sendCommand() メソッドでもポインター レシーバーを使用する必要があります。

func (this *MockConnector) sendCommand(payload map[string]string) {
    fmt.Println("0", this)
    this.last_command = payload
    this.value = true
    fmt.Println("0", this)
}

もう 1 つの Go 規約は、使用を避けることです。受信者名として「this」または「self」を使用します。代わりに、メソッドの機能に一致する簡潔でわかりやすい名前を使用することをお勧めします。

これらの変更を実装すると、構造体フィールドは元の値に戻ることなく正常に更新されます。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。