Ajout de tranches de Golang à l'aide de la réflexion : une exploration complète
Énoncé du problème :
Dans Allez, lorsque vous tentez d'ajouter un élément à une tranche en utilisant la réflexion, la tranche d'origine reste inchangée. Ceci est démontré dans le code ci-dessous :
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 }
Comprendre le comportement :
La fonction Reflect.Append fonctionne de la même manière que la fonction d'ajout intégrée en renvoyant un nouvelle valeur de tranche. Dans l'exemple fourni, le code attribue la valeur renvoyée à la variable de valeur dans la fonction appendToSlice, remplaçant ainsi le reflet.Value précédent. Cependant, cela ne modifie pas l'argument d'origine.
Approche correcte pour ajouter à l'aide de la réflexion :
Pour ajouter un élément à la tranche d'origine à l'aide de la réflexion, le Value.Set méthode doit être employée. Voici le code modifié :
func appendToSlice(arrPtr interface{}) { valuePtr := reflect.ValueOf(arrPtr) value := valuePtr.Elem() value.Set(reflect.Append(value, reflect.ValueOf(55))) fmt.Println(value.Len()) }
En utilisant Value.Set, la variable de valeur est mise à jour avec la valeur de tranche ajoutée, qui se reflète ensuite dans la tranche d'origine référencée par l'argument arrPtr.
Conclusion :
L'ajout de tranches Go à l'aide de la réflexion nécessite l'utilisation de la méthode Value.Set pour modifier la tranche d'origine. La fonction Reflect.Append renvoie une nouvelle valeur de tranche, qui doit être attribuée à la tranche d'origine à l'aide de Value.Set. Cela garantit que les modifications apportées dans la portée de réflexion sont reflétées dans 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!