Heim > Backend-Entwicklung > Golang > Warum funktioniert das Anhängen an ein Slice innerhalb einer Golang-Strukturmethode nicht, es sei denn, ein Zeigerempfänger wird verwendet?

Warum funktioniert das Anhängen an ein Slice innerhalb einer Golang-Strukturmethode nicht, es sei denn, ein Zeigerempfänger wird verwendet?

Linda Hamilton
Freigeben: 2024-12-31 15:09:10
Original
441 Leute haben es durchsucht

Why doesn't appending to a slice within a Golang struct method work unless a pointer receiver is used?

Warum kann ich nicht an ein Slice anhängen, das die Eigenschaft einer Struktur in Golang ist?

In Golang wird alles als Wert übergeben , was bedeutet, dass immer dann eine Kopie eines Objekts erstellt wird, wenn es als Argument an eine Funktion übergeben wird. Dies kann zu unerwartetem Verhalten führen, wenn versucht wird, an einen Slice anzuhängen, der eine Eigenschaft einer Struktur ist.

Das Problem: Test3

Betrachten Sie das folgende Beispiel:

package main

import "fmt"

type Test3 struct {
    all []int
}

func (c Test3) run() []int {
    c.combo()
    return c.all
}

func (c Test3) combo() {
    for i := 0; i < 2; i++ {
        c.all = append(c.all, i)
        fmt.Println("Test3 step", i+1, c.all)
    }
}

func main() {
    test3 := &Test3{}
    fmt.Println("Test3 final:", test3.run())
}
Nach dem Login kopieren

Wenn Sie test3.run() aufrufen, erstellt es eine Kopie von test3 und übergibt sie an die Ausführung. Die run-Methode ruft dann Combo auf, das zwei Werte an c.all anhängt. Wenn run jedoch zurückkehrt, gehen die Änderungen an c.all verloren, da die Kopie von test3 verworfen wird. Dies führt dazu, dass ein leeres Slice zurückgegeben wird, wie in der Ausgabe zu sehen ist:

Test3 step 1 [0]
Test3 step 2 [0 1]
Test3 final: []
Nach dem Login kopieren

Die Lösung: Verwendung eines Zeigerempfängers

Um dieses Problem zu beheben, benötigen Sie um einen Zeigerempfänger für die Combo-Methode zu verwenden. Dadurch wird der Compiler angewiesen, einen Zeiger auf den Test3-Wert anstelle einer Kopie zu übergeben.

func (c *Test3) combo() {
    for i := 0; i < 2; i++ {
        c.all = append(c.all, i)
        fmt.Println("Test3 step", i+1, c.all)
    }
}
Nach dem Login kopieren

Mit dem Zeigerempfänger werden die an c.all in Combo vorgenommenen Änderungen direkt auf den ursprünglichen Test3-Wert angewendet, da es wird als Referenz übergeben. Dies führt zur korrekten Ausgabe:

Test3 step 1 [0]
Test3 step 2 [0 1]
Test3 final: [0 1]
Nach dem Login kopieren

Durch das Verständnis des Konzepts der Wertübergabe und die entsprechende Verwendung von Zeigerempfängern können Sie unerwartetes Verhalten beim Arbeiten mit Slices in Golang-Strukturen vermeiden.

Das obige ist der detaillierte Inhalt vonWarum funktioniert das Anhängen an ein Slice innerhalb einer Golang-Strukturmethode nicht, es sei denn, ein Zeigerempfänger wird verwendet?. 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