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

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

Patricia Arquette
Libérer: 2024-11-01 07:21:02
original
556 Les gens l'ont consulté

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

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!

source:php.cn
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