Slice-Manipulation in Go verstehen
In Go ist es bei der Manipulation von Slices als Eigenschaften von Strukturen wichtig, die Wertübergabe zu berücksichtigen. In bestimmten Situationen scheint das Anhängen an einen Slice innerhalb einer Methode fehlzuschlagen. Lassen Sie uns die Gründe dafür untersuchen und eine Lösung finden.
Wertübergabe in Go-Strukturen
In Go wird alles als Wert übergeben, was bedeutet, dass eine Kopie erstellt wird für jeden übergebenen Wert. Daher wirken sich alle an der Kopie innerhalb einer Methode vorgenommenen Änderungen nicht auf den Originalwert aus.
Test3: Ein fehlgeschlagener Anhängeversuch
Beachten Sie den folgenden Code:
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) } }
Wenn Sie Test3.run() aufrufen, scheint es, dass c.all nicht geändert wird. Dies liegt daran, dass die Methode „combo()“ auf einer Kopie von Test3 ausgeführt wird und alle innerhalb von „combo()“ vorgenommenen Änderungen nicht auf den ursprünglichen Wert zurückgeführt werden.
Lösung: Verwendung von Zeigerempfängern
Um dieses Problem zu beheben, verwenden Sie einen Zeigerempfänger für die Methode „combo()“:
func (c *Test3) combo() { for i := 0; i < 2; i++ { c.all = append(c.all, i) fmt.Println("Test3 step", i + 1, c.all) } }
Durch die Verwendung eines Zeigerempfängers stellen Sie sicher, dass „combo()“ ändert den ursprünglichen Test3-Wert und die Änderungen werden widergespiegelt, wenn die Methode zurückkehrt.
Das obige ist der detaillierte Inhalt vonWarum funktioniert das Anhängen an ein Slice in einer Go-Struct-Methode nicht immer?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!