"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment utiliser Reflection pour modifier les champs Struct avec CanSet() et Structs ?

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

Publié le 2024-11-09
Parcourir:883

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 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 :

  1. Modifier une valeur : Lorsque vous appelez votre fonction SetField(), transmettez le pointeur vers la structure, pas vers la structure se valoriser. Cela vous permet de modifier la structure réelle, pas une copie.
  2. Utilisez Value.Elem() pour les pointeurs : Si vous transmettez 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 :

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.

Déclaration de sortie Cet article est réimprimé à l'adresse : 1729741550. En cas d'infraction, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

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