Heim >Backend-Entwicklung >Golang >Warum wird mein Strukturfeld in Go unerwartet zurückgesetzt?

Warum wird mein Strukturfeld in Go unerwartet zurückgesetzt?

Susan Sarandon
Susan SarandonOriginal
2024-11-17 07:15:03212Durchsuche

Why Does My Struct Field Revert Unexpectedly in Go?

Strukturfeld wird unerwartet zurückgesetzt

In Go werden Strukturen als Wert übergeben, was bedeutet, dass an einer Struktur innerhalb einer Funktion vorgenommene Änderungen nicht in der ursprünglichen Struktur widergespiegelt werden. Dies wird im bereitgestellten Code deutlich, wo ein Strukturfeld auf seinen ursprünglichen Wert zurückgesetzt wird, obwohl der Wert scheinbar innerhalb einer Methode geändert wurde.

Das Problem liegt darin, wie die Struktur an die Methode übergeben wird. Im angegebenen Code ändert die TVManager-Methode sendMessage() eine Kopie des Connector-Felds, und alle innerhalb der Methode vorgenommenen Änderungen werden nicht zurück an die ursprüngliche Struktur weitergegeben.

Um dies zu beheben, sollte die Methode verwenden ein Zeigerempfänger. Indem dem Empfänger ein Sternchen (*) vorangestellt wird, erhält die Methode einen Zeiger auf die tatsächliche Strukturinstanz und alle innerhalb der Methode vorgenommenen Änderungen werden auf die ursprüngliche Struktur angewendet.

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)
}

Ähnlich gilt in der Wenn Sie ein Scheinobjekt verwenden, sollte die sendCommand()-Methode auch einen Zeigerempfänger verwenden.

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

Eine weitere Go-Konvention besteht darin, die Verwendung von „this“ oder „self“ als Empfänger zu vermeiden Namen. Stattdessen wird empfohlen, einen prägnanten und beschreibenden Namen zu verwenden, der der Funktionalität der Methode entspricht.

Durch die Implementierung dieser Änderungen wird das Strukturfeld erfolgreich aktualisiert, ohne dass es auf seinen ursprünglichen Wert zurückgesetzt wird.

Das obige ist der detaillierte Inhalt vonWarum wird mein Strukturfeld in Go unerwartet zurückgesetzt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn