Utiliser la réflexion pour modifier les champs de structure : CanSet() et Structs
Lorsque vous utilisez la réflexion pour modifier les champs de structure, il est important de comprendre les principes derrière l'accessibilité et la modification des champs.
CanSet() pour Structs
Dans votre exemple, vous avez rencontré CanSet() renvoyant false pour les champs de structure. En effet, par défaut, Go n'autorise pas la modification des champs non exportés (privés) d'une structure à l'aide de la réflexion. Il s'agit d'une mesure de sécurité destinée à empêcher toute modification accidentelle ou malveillante de l'état de la structure interne.
Résoudre les problèmes
Pour définir les valeurs des champs de structure à l'aide de la réflexion, tenez compte des éléments suivants étapes :
Code modifié
Voici le code modifié qui résout les problèmes :
func SetField(source interface{}, fieldName string, fieldValue string) {
v := reflect.ValueOf(source).Elem()
fmt.Println(v.FieldByName(fieldName).CanSet())
if v.FieldByName(fieldName).CanSet() {
v.FieldByName(fieldName).SetString(fieldValue)
}
}
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])
}
Ce code va désormais modifier avec succès la valeur Field1 de 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