Explorer Reflection avec SetString pour Structs
Reflection fournit des outils puissants pour manipuler dynamiquement les structures Go. 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 :
<code class="go">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) } }</code>
Dans la fonction SetField() modifiée, nous :
Code en action
Avec ces modifications, le code maintenant met à jour avec succès la valeur Field1 :
<code class="go">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>
Sortie :
Before: {A 2} true After: {NEW_VALUE 2}
Le résultat présente la modification réussie de Field1 dans 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!