Maison  >  Article  >  développement back-end  >  Comment parcourir les champs de chaîne dans une structure en utilisant la réflexion dans Go ?

Comment parcourir les champs de chaîne dans une structure en utilisant la réflexion dans Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-01 07:21:02468parcourir

How to iterate over string fields in a struct using reflection in Go?

Itération sur les champs de chaîne dans une structure

Problème :

Itération sur les champs de chaîne d'une structure présente un défi, en particulier lorsque l'on cherche à effectuer des opérations de nettoyage ou de validation. L'implémentation de ceci avec une approche de changement de cas manque d'évolutivité et n'est pas adaptée lors de l'exploitation du gorille/schéma pour le démarshalling.

Solution :

Reflect fournit un moyen d'itérer sur la structure champs et manipuler les champs de chaîne de manière transparente. Voici comment y parvenir :

  1. Obtenir un pointeur vers la structure :
    Pour modifier les valeurs, un pointeur vers la structure est requis.
  2. Itérer sur les champs :
    Utilisez NumFields() pour déterminer le nombre de champs et Field() pour parcourir chaque champ de la structure.
  3. Vérifiez le type de champ :
    Vérifiez le type de chaque champ à l'aide de Type(). Seuls les champs de chaîne nécessitent une modification.
  4. Nettoyer la chaîne :
    Récupérez la valeur du champ avec Interface() et appliquez les opérations de nettoyage souhaitées à partir du package de chaînes (par exemple, TrimSpace).
  5. Mettre à jour la valeur :
    Utilisez SetString() pour mettre à jour la valeur du champ de chaîne.

Exemple :

<code class="go">package main

import (
    "fmt"
    "reflect"
    "strings"
)

type MyStruct struct {
    A, B, C string
    I int
    D string
    J int
}

func main() {
    ms := MyStruct{"Green ", "Eggs", " and ", 2, "Ham      ", 15}
    fmt.Printf("%s%s%s%d%s%d\n", ms.A, ms.B, ms.C, ms.I, ms.D, ms.J)

    msValuePtr := reflect.ValueOf(&ms)
    msValue := msValuePtr.Elem()

    for i := 0; i < msValue.NumField(); i++ {
        field := msValue.Field(i)
        if field.Type() != reflect.TypeOf("") {
            continue
        }
        str := field.Interface().(string)
        str = strings.TrimSpace(str)
        field.SetString(str)
    }
    fmt.Printf("%s%s%s%d%s%d\n", ms.A, ms.B, ms.C, ms.I, ms.D, ms.J)
}</code>

Avertissements :

  • Cette approche nécessite un pointeur vers la structure.
  • Reflect peut paniquer lorsque vous essayez de modifier des champs non exportés. Gérez cela en implémentant le code dans le package.

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