Go – Anhängen an ein Slice innerhalb einer Struktur
In Go sind Slices Referenztypen, das heißt, sie enthalten einen Verweis auf das zugrunde liegende Array. Wenn Sie ein Element an einen Slice innerhalb einer Struktur anhängen und das Ergebnis nicht wieder dem Slice zuweisen, werden die Änderungen nicht beibehalten, wenn die Funktion zurückkehrt.
Beachten Sie den folgenden Code:
type MyBoxItem struct { Name string } type MyBox struct { Items []MyBoxItem } func (box *MyBox) AddItem(item MyBoxItem) []MyBoxItem { return append(box.Items, item) }
Hier nimmt die AddItem-Methode ein Element und hängt es an den Elementabschnitt in der Boxstruktur an. Allerdings weist die Methode das Ergebnis nicht wieder dem Items-Slice zu, was bedeutet, dass das Slice nicht geändert wird, wenn die Methode zurückkehrt.
Um dies zu beheben, müssen Sie das Ergebnis des Anhängevorgangs zurück zuweisen zur Scheibe. Sie können dies tun, indem Sie die AddItem-Methode wie folgt ändern:
func (box *MyBox) AddItem(item MyBoxItem) { box.Items = append(box.Items, item) }
Wenn Sie nun die AddItem-Methode aufrufen, wird das Slice innerhalb der Struktur aktualisiert. Sie können dies überprüfen, indem Sie die len-Funktion im Items-Slice aufrufen:
item1 := MyBoxItem{Name: "Test Item 1"} item2 := MyBoxItem{Name: "Test Item 2"} items := []MyBoxItem{} box := MyBox{items} box.AddItem(item1) fmt.Println(len(box.Items)) // Output: 1
Beachten Sie, dass die AddItem-Methode für den Typ *MyBox definiert ist, was bedeutet, dass Sie sie als box.AddItem(item1) aufrufen müssen. , indem ein Zeiger auf die Box-Struktur als Argument übergeben wird.
Das obige ist der detaillierte Inhalt vonWarum bleibt das Anhängen an ein Slice in einer Go-Struktur nicht ohne Neuzuweisung bestehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!