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 }
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)) }
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()) }
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!