Maison > développement back-end > Golang > Pourquoi Reflect.Append ne modifie-t-il pas la tranche Go originale et comment puis-je y remédier ?

Pourquoi Reflect.Append ne modifie-t-il pas la tranche Go originale et comment puis-je y remédier ?

DDD
Libérer: 2024-12-04 10:51:10
original
1004 Les gens l'ont consulté

Why Doesn't Reflect.Append Modify the Original Go Slice, and How Can I Fix It?

Ajouter une tranche Go Lang à l'aide de la réflexion : comprendre les mécanismes

Lorsque vous essayez d'ajouter un nouvel élément à une tranche à l'aide de la réflexion, il est on s'attend à ce que la tranche d'origine soit mise à jour en conséquence. Cependant, on peut observer que cela ne se produit pas, comme le démontre le code suivant :

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

Comprendre la raison

La clé pour comprendre ce comportement réside en reconnaissant le fonctionnement de Reflect.Append. Semblable à la fonction append de la bibliothèque standard, Reflect.Append crée une nouvelle valeur de tranche au lieu de modifier l'originale. Dans l'extrait de code ci-dessus, la valeur est attribuée à la tranche nouvellement créée, qui remplace la valeur d'origine dans la fonction mais n'affecte pas l'argument d'origine en dehors de la fonction.

Correction de l'approche

Pour modifier la tranche d'origine à l'aide de la réflexion, la méthode Value.Set doit être utilisée. Cette méthode permet de mettre à jour la valeur d'origine. La version corrigée de la fonction appendToSlice serait :

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

Cela garantit que la tranche d'origine est modifiée comme prévu et le résultat suivant est obtenu :

1
1
Copier après la connexion

Conclusion

Lorsque vous utilisez la réflexion pour modifier des tranches, il est essentiel de considérer que Reflect.Append crée une nouvelle tranche plutôt que de modifier l'original. En utilisant la méthode Value.Set, on peut modifier efficacement la tranche d'origine par réflexion, garantissant ainsi que le résultat attendu est atteint.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal