Strukturfeldumkehr in Go
Beim Versuch, ein Feld in einer Struktur innerhalb eines Go-Programms zu ändern, kann es zu einem Szenario kommen, in dem die Das Feld scheint auf seinen ursprünglichen Wert zurückzukehren. Dieses Problem entsteht aufgrund der Art und Weise, wie Strukturen in Go als Wert übergeben werden.
In Ihrem Code verfügt die MockConnector-Struktur über zwei Felder: last_command und value. Die sendCommand-Methode von MockConnector ändert diese Felder. Wenn Sie jedoch manager.sendMessage aus der TVManager-Struktur aufrufen, übergeben Sie die Connector-Instanz als Wert. Das bedeutet, dass sendCommand eine Kopie der Connector-Struktur erhält und keinen Verweis auf das Original.
Um dieses Problem zu beheben, müssen Sie Zeiger auf die beteiligten Strukturen verwenden. Indem Sie einen Zeiger auf eine Struktur übergeben, übergeben Sie einen Verweis auf die tatsächliche Struktur im Speicher. Dadurch können Sie die Felder der Struktur direkt ändern.
Korrigierter Code:
func (this *MockConnector) sendCommand(payload map[string]string) { fmt.Println("0", this) this.last_command = payload this.value = true fmt.Println("0", this) }
Durch Ändern der sendCommand-Methode, um einen Zeiger auf die MockConnector-Struktur zu empfangen, Sie ändern jetzt die tatsächliche Connector-Instanz und nicht nur eine Kopie.
Empfängername:
Darüber hinaus gilt es als bewährte Vorgehensweise, die Verwendung dieses Namens als Empfängernamen in Go zu vermeiden Strukturmethoden. Verwenden Sie stattdessen einen aussagekräftigeren Namen, um den Empfängertyp anzugeben.
Konsistenter Methodensatz:
Wenn eine Methode in einer Struktur einen Zeigerempfänger erfordert, wird dies empfohlen Stellen Sie sicher, dass alle Methoden in dieser Struktur Zeigerempfänger verwenden. Dies stellt die Konsistenz des Methodensatzes sicher, unabhängig davon, ob der Empfänger ein Wert oder ein Zeiger ist.
Durch die Anwendung dieser Empfehlungen können Sie das Problem des Zurücksetzens von Feldwerten in Ihrem Go-Programm beseitigen.
Das obige ist der detaillierte Inhalt vonWarum wird mein Go-Strukturfeld bei einer Änderung auf seinen ursprünglichen Wert zurückgesetzt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!