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!