Heim >Backend-Entwicklung >Golang >Warum benötige ich einen Zeigerempfänger, um Elemente aus einem Slice innerhalb einer Go-Struktur zu entfernen?

Warum benötige ich einen Zeigerempfänger, um Elemente aus einem Slice innerhalb einer Go-Struktur zu entfernen?

DDD
DDDOriginal
2024-11-15 11:43:02796Durchsuche

Why Do I Need a Pointer Receiver to Remove Elements from a Slice within a Go Struct?

Elemente aus einem Slice innerhalb einer Struktur entfernen

In Go erfordert das Ändern eines Empfängerobjekts innerhalb einer Methode die Verwendung eines Zeigerempfängers. Hierbei handelt es sich um eine Technik, mit der statt einer Kopie ein Verweis auf das Objekt übergeben wird, wodurch innerhalb der Methode vorgenommene Änderungen im Originalobjekt widergespiegelt werden können.

Beachten Sie die folgende Guest-Struktur:

type Guest struct {
    id        int
    name      string
    surname   string
    friends   []int
}

Um ein Element aus dem „Friends“-Slice zu entfernen, könnte man zunächst den folgenden Code schreiben:

func (self Guest) removeFriend(id int) {
    for i, other := range self.friends {
        if other == id {
            self.friends = append(self.friends[:i], self.friends[i+1:]...)
            break
        }
    }
}

Dieser Code würde das Element jedoch nicht wie erwartet entfernen, da die Methode „removeFriend“ verwendet wird ein Wertempfänger anstelle eines Zeigerempfängers. Daher werden die am Slice „friends“ in der Methode vorgenommenen Änderungen nicht auf das ursprüngliche Objekt übertragen.

Um dieses Problem zu beheben, sollte die Methode „removeFriend“ überarbeitet werden, um einen Zeigerempfänger zu verwenden:

func (self *Guest) removeFriend(id int) {
    // Same logic as before
}

Durch die Verwendung eines Zeigerempfängers ändert die Methode jetzt das Originalobjekt und nicht eine Kopie. Dadurch werden die innerhalb der Methode am „Friends“-Slice vorgenommenen Änderungen erfolgreich auf das ursprüngliche Guest-Objekt übertragen.

Das obige ist der detaillierte Inhalt vonWarum benötige ich einen Zeigerempfänger, um Elemente aus einem Slice innerhalb einer Go-Struktur zu entfernen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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