Heim >Backend-Entwicklung >Golang >Warum ändert „reflect.Append' von Reflection das ursprüngliche Go-Slice nicht und wie kann ich das Problem beheben?

Warum ändert „reflect.Append' von Reflection das ursprüngliche Go-Slice nicht und wie kann ich das Problem beheben?

DDD
DDDOriginal
2024-11-23 09:49:18943Durchsuche

Why Doesn't Reflection's `reflect.Append` Modify the Original Go Slice, and How Can I Fix It?

Anhängen an Golang-Slices mithilfe von Reflection: Eine umfassende Untersuchung

Problemstellung:

In Go: Wenn Sie versuchen, ein Element mithilfe von Reflektion an ein Slice anzuhängen, bleibt das ursprüngliche Slice unverändert. Dies wird im folgenden Code demonstriert:

package main

import (
    "fmt"
    "reflect"
)

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
}

Verstehen des Verhaltens:

Die Funktion „reflect.Append“ funktioniert ähnlich wie die integrierte Append-Funktion, indem sie a zurückgibt neuer Slice-Wert. Im bereitgestellten Beispiel weist der Code den zurückgegebenen Wert der Wertvariablen innerhalb der Funktion „appendToSlice“ zu und ersetzt so effektiv den vorherigen „reflect.Value“. Dies ändert jedoch nichts am ursprünglichen Argument.

Korrekter Ansatz zum Anhängen mithilfe von Reflektion:

Um ein Element mithilfe von Reflektion an den ursprünglichen Slice anzuhängen, wird der Value.Set Methode angewendet werden sollte. Hier ist der geänderte Code:

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

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

    fmt.Println(value.Len())
}

Durch die Verwendung von Value.Set wird die Wertvariable mit dem angehängten Slice-Wert aktualisiert, der sich dann im ursprünglichen Slice widerspiegelt, auf das durch das Argument arrPtr verwiesen wird.

Fazit:

Das Anhängen an Go-Slices mithilfe von Reflektion erfordert die Verwendung der Value.Set-Methode, um das ursprüngliche Slice zu ändern. Die Funktion „reflect.Append“ gibt einen neuen Slice-Wert zurück, der mit Value.Set dem ursprünglichen Slice zugewiesen werden muss. Dadurch wird sichergestellt, dass die innerhalb des Reflexionsbereichs vorgenommenen Änderungen im ursprünglichen Slice widergespiegelt werden.

Das obige ist der detaillierte Inhalt vonWarum ändert „reflect.Append' von Reflection das ursprüngliche Go-Slice nicht und wie kann ich das Problem beheben?. 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