Heim > Backend-Entwicklung > Golang > Wie kann ich innerhalb einer Go-Struktur korrekt an ein Slice anhängen?

Wie kann ich innerhalb einer Go-Struktur korrekt an ein Slice anhängen?

Susan Sarandon
Freigeben: 2024-12-13 01:29:14
Original
257 Leute haben es durchsucht

How to Correctly Append to a Slice within a Go Struct?

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))
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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))
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage