Maison > développement back-end > Golang > Pourquoi la fonction « Append » de Reflection ne met-elle pas à jour la tranche Go originale ?

Pourquoi la fonction « Append » de Reflection ne met-elle pas à jour la tranche Go originale ?

Barbara Streisand
Libérer: 2024-11-26 01:10:12
original
583 Les gens l'ont consulté

Why Doesn't Reflection's `Append` Function Update the Original Go Slice?

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
}
Copier après la connexion

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))
}
Copier après la connexion

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())
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal