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
DDDoriginal
2024-12-04 10:51:101002parcourir

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
}

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())
}

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

1
1

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!

Déclaration:
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