Maison  >  Article  >  développement back-end  >  Comment utiliser Reflection pour modifier les champs Struct avec CanSet() et Structs ?

Comment utiliser Reflection pour modifier les champs Struct avec CanSet() et Structs ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-24 19:02:29819parcourir

How to Use Reflection to Modify Struct Fields with CanSet() and Structs?

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 :

  1. Modifier une valeur : Lorsque vous appelez votre fonction SetField(), transmettez le pointeur vers la structure, pas la valeur de la structure elle-même. Cela vous permet de modifier la structure réelle, pas une copie.
  2. Utilisez Value.Elem() pour les pointeurs : Si vous passez un pointeur vers la structure, vous devez utiliser Reflect.ValueOf (source).Elem() pour obtenir la réflexion.Value de la structure pointée. Cela accède à la valeur réelle de la structure.
  3. Utilisez FieldByName pour l'accès aux champs : Au lieu de parcourir tous les champs de la structure, utilisez v.FieldByName(fieldName) pour accéder au champ spécifique souhaité. à modifier. Cela garantit que vous accédez au bon champ et est plus efficace.

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!

Déclaration:
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