Go – Anhängen an ein Slice in einer Struktur
In Go erfordert das Anhängen an ein Slice innerhalb einer Struktur sorgfältige Beachtung von Variablenreferenzen. Dies kann beim Arbeiten mit Slices innerhalb von Strukturen verwirrend sein, insbesondere wenn die Methode, die die Struktur empfängt, ein Zeigerempfänger ist.
Problem
Bedenken Sie den folgenden Code:
package main import "fmt" type MyBoxItem struct { Name string } type MyBox struct { Items []MyBoxItem } func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem { return append(box.Items, item) } func main() { item1 := MyBoxItem{Name: "Test Item 1"} box := MyBox{[]MyBoxItem{}} // Initialize box with an empty slice AddItem(box, item1) // This is where the problem arises fmt.Println(len(box.Items)) }
Das Problem tritt beim Aufruf der AddItem-Methode auf. Wenn Sie die Methode als AddItem(box, item1) anstelle von box.AddItem(item1) aufrufen, wird eine neue Kopie der Box-Struktur erstellt, anstatt das Original zu ändern.
Lösung
Um dieses Problem zu beheben, weisen Sie das Ergebnis der AddItem-Methode wieder dem ursprünglichen Slice in der Struktur zu:
func (box *MyBox) AddItem(item MyBoxItem) { box.Items = append(box.Items, item) }
Auf diese Weise Die am Slice innerhalb der AddItem-Methode vorgenommenen Änderungen werden im ursprünglichen Slice-Feld der Struktur widergespiegelt.
Überarbeitete Hauptfunktion
Mit der aktualisierten AddItem-Methode wurde das korrigiert Die Hauptfunktion sollte wie folgt lauten:
func main() { item1 := MyBoxItem{Name: "Test Item 1"} box := MyBox{[]MyBoxItem{}} box.AddItem(item1) // Call the method correctly fmt.Println(len(box.Items)) }
Jetzt gibt die Ausgabe korrekt die Länge des Items-Slice aus, die nach dem Hinzufügen 1 sein sollte Artikel.
Das obige ist der detaillierte Inhalt vonWie kann ich innerhalb einer Go-Struktur korrekt an ein Slice anhängen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!