Ajouter une fonction dans Go Reflection
Dans Go, l'ajout d'un élément à une tranche à l'aide de la réflexion ne semble pas mettre à jour la tranche d'origine. Ceci est illustré dans le code suivant :
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 }
Pourquoi cela ne fonctionne-t-il pas ?
La cause profonde réside dans le comportement de Reflect.Append. Comme la fonction d'ajout conventionnelle, elle renvoie une nouvelle valeur de tranche. Dans ce cas, la valeur attribuée à la variable value est remplacée par cette nouvelle tranche, créant ainsi une copie.
Pour illustrer, modifions l'exemple pour mettre en évidence ce qui se passe :
func appendToSlice(arrPtr *[]int) { value := *arrPtr value = append(value, 55) fmt.Println(len(value)) } func main() { arr := []int{} appendToSlice(&arr) fmt.Println(len(arr)) }
Ce code modifié produit le même résultat même si nous n'utilisons pas de réflexion.
Solution
Pour ajouter correctement à une tranche en utilisant la réflexion, nous devons utiliser la méthode Value.Set pour modifier la valeur d'origine :
func appendToSlice(arrPtr interface{}) { valuePtr := reflect.ValueOf(arrPtr) value := valuePtr.Elem() value.Set(reflect.Append(value, reflect.ValueOf(55))) fmt.Println(value.Len()) }
Cette approche transmet la tranche nouvellement créée à value.Set, mettant à jour la tranche d'origine.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!