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