"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 surmonter SetCan() renvoyant toujours False lors de la définition des valeurs de champ de structure à l'aide de Reflection ?

Comment surmonter SetCan() renvoyant toujours False lors de la définition des valeurs de champ de structure à l'aide de Reflection ?

Publié le 2024-11-09
Parcourir:930

How to Overcome SetCan() Always Returning False When Setting Struct Field Values Using Reflection?

Exploration de Reflection avec SetString for Structs

Reflection fournit des outils puissants pour manipuler les structures Go de manière dynamique. 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 :

  1. Passer une valeur au lieu d'un pointeur : Les structures par valeur ne peuvent pas être modifiées par réflexion. Au lieu de cela, nous devons passer un pointeur vers la structure, garantissant que toutes les modifications sont appliquées à l'objet réel.
  2. Ciblage d'élément incorrect : Le code opère initialement sur l'intégralité de la structure ProductionInfo plutôt que sur la structure ProductionInfo entière. Entrée spécifique dont la valeur Field1 doit être modifiée. Pour remédier à cela, nous devons nous concentrer sur l'élément Entry souhaité.

Résoudre les problèmes

Après avoir résolu ces pièges, nous pouvons affiner notre code :

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)
    }
}

Dans la fonction SetField() modifiée, nous :

  1. Utilisons Elem() pour accéder à la valeur de l'objet pointé, en nous assurant que nous opérons sur la structure réelle.
  2. Utilisez FieldByName() pour accéder au champ spécifique que nous souhaitons modifier.

Code dans Action

Avec ces modifications, le code met désormais à jour avec succès la valeur Field1 :

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])
}

Sortie :

Before:  {A 2}
true
After:  {NEW_VALUE 2}

Le résultat présente la modification réussie de Field1 dans la structure Entry.

Déclaration de sortie Cet article est réimprimé à l'adresse : 1729662680. 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