Heim > Backend-Entwicklung > Golang > Warum aktualisiert die Funktion „Anhängen' von Reflection das ursprüngliche Go-Slice nicht?

Warum aktualisiert die Funktion „Anhängen' von Reflection das ursprüngliche Go-Slice nicht?

Barbara Streisand
Freigeben: 2024-11-26 01:10:12
Original
576 Leute haben es durchsucht

Why Doesn't Reflection's `Append` Function Update the Original Go Slice?

Append-Funktion in Go Reflection

In Go scheint das Anhängen eines Elements an ein Slice mithilfe von Reflection das ursprüngliche Slice nicht zu aktualisieren. Dies wird im folgenden Code veranschaulicht:

func appendToSlice(arrPtr interface{}) {
    valuePtr := reflect.ValueOf(arrPtr)
    value := valuePtr.Elem()
    value = reflect.Append(value, reflect.ValueOf(55))

    fmt.Println(value.Len()) // prints 1
}

func main() {
    arr := []int{}
    appendToSlice(&arr)
    fmt.Println(len(arr)) // prints 0
}
Nach dem Login kopieren

Warum funktioniert es nicht?

Die Hauptursache liegt im Verhalten von Reflect.Append. Wie die herkömmliche Append-Funktion gibt sie einen neuen Slice-Wert zurück. In diesem Fall wird der der Wertvariablen zugewiesene Wert durch dieses neue Segment ersetzt, wodurch effektiv eine Kopie erstellt wird.

Zur Veranschaulichung ändern wir das Beispiel, um hervorzuheben, was passiert:

func appendToSlice(arrPtr *[]int) {
    value := *arrPtr
    value = append(value, 55)
    fmt.Println(len(value))
}

func main() {
    arr := []int{}
    appendToSlice(&arr)
    fmt.Println(len(arr))
}
Nach dem Login kopieren

Dieser geänderte Code erzeugt die gleiche Ausgabe, auch wenn wir keine Reflektion verwenden.

Lösung

An Um mithilfe von Reflektion korrekt an ein Slice anzuhängen, müssen wir die Value.Set-Methode verwenden, um den ursprünglichen Wert zu ändern:

func appendToSlice(arrPtr interface{}) {
    valuePtr := reflect.ValueOf(arrPtr)
    value := valuePtr.Elem()

    value.Set(reflect.Append(value, reflect.ValueOf(55)))

    fmt.Println(value.Len())
}
Nach dem Login kopieren

Dieser Ansatz übergibt das neu erstellte Slice an value.Set und aktualisiert so das ursprüngliche Slice.

Das obige ist der detaillierte Inhalt vonWarum aktualisiert die Funktion „Anhängen' von Reflection das ursprüngliche Go-Slice nicht?. 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