Maison > développement back-end > Golang > 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
Libérer: 2024-10-24 19:02:29
original
938 Les gens l'ont consulté

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>
Copier après la connexion

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!

source:php
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal