Maison > développement back-end > Golang > le corps du texte

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

Barbara Streisand
Libérer: 2024-10-24 04:19:30
original
482 Les gens l'ont consulté

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

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 :

  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'ensemble de la structure ProductionInfo plutôt que sur la Entrée spécifique dont la valeur Field1 doit être modifiée. Pour remédier à cela, nous devons nous concentrer sur l'élément d'entrée souhaité.

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

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

Sortie :

Before:  {A 2}
true
After:  {NEW_VALUE 2}
Copier après la connexion

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!

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!