Maison > développement back-end > Golang > Pourquoi « reflect.Append » de Reflection ne modifie-t-il pas la tranche Go d'origine et comment puis-je y remédier ?

Pourquoi « reflect.Append » de Reflection ne modifie-t-il pas la tranche Go d'origine et comment puis-je y remédier ?

DDD
Libérer: 2024-11-23 09:49:18
original
957 Les gens l'ont consulté

Why Doesn't Reflection's `reflect.Append` Modify the Original Go Slice, and How Can I Fix It?

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

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

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!

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