Heim > Artikel > Backend-Entwicklung > Warum führt die Verwendung eines Wertempfängers zu einer falschen Slice-Änderung in einer Go-Struktur?
Entfernen von Elementen aus einem Slice in einer Struktur (behoben)
Im bereitgestellten Code-Snippet gibt es ein Problem beim Versuch, ein zu entfernen Element aus einem Slice innerhalb einer Struktur mithilfe eines Wertempfängers. Dies führt zu einer falschen Änderung des Slice in der ursprünglichen Struktur.
Um dieses Problem zu beheben, muss in der Methode, die das Slice ändert, ein Zeigerempfänger verwendet werden. Dies liegt daran, dass Go-Wertempfänger eine Kopie des Empfängerwerts erstellen, was bedeutet, dass alle am Empfänger in der Methode vorgenommenen Änderungen nicht in der Originalstruktur widergespiegelt werden.
Hier ist der korrigierte Code:
func (guest *Guest) removeFriend(id int) { for i, other := range guest.friends { if other == id { guest.friends = append(guest.friends[:i], guest.friends[i+1:]...) break } } }
Durch die Verwendung eines Zeigerempfängers (*Guest) ändert die Methode das Friends-Slice der ursprünglichen Guest-Struktur und stellt so sicher, dass das Element korrekt entfernt wird.
Erklärung:
Wenn ein Slice als Wert übergeben wird, verarbeitet die Empfängermethode eine Kopie des Slice. Wenn am Slice Änderungen vorgenommen werden, werden diese nur in der Kopie widergespiegelt, nicht im Original-Slice. Die Verwendung eines Zeigerempfängers ermöglicht es der Methode jedoch, das ursprüngliche Slice zu ändern, da der Empfänger jetzt ein Zeiger auf die ursprüngliche Struktur ist.
Beispielverwendung:
guest := &Guest{ id: 1, name: "Bob", surname: "Pats", friends: []int{1, 2, 3, 4, 5}, } fmt.Println(guest) guest.removeFriend(3) fmt.Println(guest)
Ausgabe:
&{1 Bob Pats [1 2 3 4 5]} &{1 Bob Pats [1 2 4 5]}
Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung eines Wertempfängers zu einer falschen Slice-Änderung in einer Go-Struktur?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!