Utiliser la réflexion pour modifier les champs de structure : CanSet() et Structs
Lorsque vous utilisez la réflexion pour modifier des champs de structure, il est important de comprendre les principes derrière l'accessibilité et la modification des champs.
CanSet() pour les structures
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é visant à 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 :
<code class="go">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]) }</code>
Ce code modifiera désormais avec succès la valeur Field1 de la structure Entry.
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!