Warum kann ich nicht an ein Slice anhängen, das die Eigenschaft einer Struktur in Golang ist?
In Golang wird alles als Wert übergeben , was bedeutet, dass immer dann eine Kopie eines Objekts erstellt wird, wenn es als Argument an eine Funktion übergeben wird. Dies kann zu unerwartetem Verhalten führen, wenn versucht wird, an einen Slice anzuhängen, der eine Eigenschaft einer Struktur ist.
Das Problem: Test3
Betrachten Sie das folgende Beispiel:
package main import "fmt" type Test3 struct { all []int } func (c Test3) run() []int { c.combo() return c.all } func (c Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) fmt.Println("Test3 step", i+1, c.all) } } func main() { test3 := &Test3{} fmt.Println("Test3 final:", test3.run()) }
Wenn Sie test3.run() aufrufen, erstellt es eine Kopie von test3 und übergibt sie an die Ausführung. Die run-Methode ruft dann Combo auf, das zwei Werte an c.all anhängt. Wenn run jedoch zurückkehrt, gehen die Änderungen an c.all verloren, da die Kopie von test3 verworfen wird. Dies führt dazu, dass ein leeres Slice zurückgegeben wird, wie in der Ausgabe zu sehen ist:
Test3 step 1 [0] Test3 step 2 [0 1] Test3 final: []
Die Lösung: Verwendung eines Zeigerempfängers
Um dieses Problem zu beheben, benötigen Sie um einen Zeigerempfänger für die Combo-Methode zu verwenden. Dadurch wird der Compiler angewiesen, einen Zeiger auf den Test3-Wert anstelle einer Kopie zu übergeben.
func (c *Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) fmt.Println("Test3 step", i+1, c.all) } }
Mit dem Zeigerempfänger werden die an c.all in Combo vorgenommenen Änderungen direkt auf den ursprünglichen Test3-Wert angewendet, da es wird als Referenz übergeben. Dies führt zur korrekten Ausgabe:
Test3 step 1 [0] Test3 step 2 [0 1] Test3 final: [0 1]
Durch das Verständnis des Konzepts der Wertübergabe und die entsprechende Verwendung von Zeigerempfängern können Sie unerwartetes Verhalten beim Arbeiten mit Slices in Golang-Strukturen vermeiden.
Das obige ist der detaillierte Inhalt vonWarum funktioniert das Anhängen an ein Slice innerhalb einer Golang-Strukturmethode nicht, es sei denn, ein Zeigerempfänger wird verwendet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!