Exploration de Reflection avec SetString for Structs
Reflection fournit des outils puissants pour manipuler les structures Go de manière dynamique. Dans cet exemple, nous rencontrons un problème courant lorsque nous essayons de définir la valeur d'un champ struct à l'aide de la réflexion : CanSet() renvoie toujours false. Cet obstacle empêche les modifications de champ, nous laissant dans un dilemme.
Identifier les pièges
L'extrait de code fourni met en évidence deux erreurs fondamentales :
Résoudre les problèmes
Après avoir résolu ces pièges, nous pouvons affiner notre code :
func SetField(source interface{}, fieldName string, fieldValue string) {
v := reflect.ValueOf(source).Elem() // Obtain the value of the pointed object
fmt.Println(v.FieldByName(fieldName).CanSet())
if v.FieldByName(fieldName).CanSet() {
v.FieldByName(fieldName).SetString(fieldValue)
}
}
Dans la fonction SetField() modifiée, nous :
Code dans Action
Avec ces modifications, le code met désormais à jour avec succès la valeur Field1 :
func main() {
source := ProductionInfo{}
source.StructA = append(source.StructA, Entry{Field1: "A", Field2: 2})
fmt.Println("Before: ", source.StructA[0])
SetField(&source.StructA[0], "Field1", "NEW_VALUE")
fmt.Println("After: ", source.StructA[0])
}
Sortie :
Before: {A 2} true After: {NEW_VALUE 2}
Le résultat présente la modification réussie de Field1 dans la structure Entry.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3