Maison > développement back-end > Golang > Comment puis-je imprimer facilement des structures Go avec leurs noms de champs et leurs méthodes String() ?

Comment puis-je imprimer facilement des structures Go avec leurs noms de champs et leurs méthodes String() ?

Barbara Streisand
Libérer: 2024-12-06 15:58:11
original
1005 Les gens l'ont consulté

How Can I Easily Print Go Structs with Their Field Names and String() Methods?

Impression de structures avec des chaînes de champs

Dans ce code :

type A struct {
    t time.Time
}

func main() {
    a := A{time.Now()}
    fmt.Println(a)
    fmt.Println(a.t)
}
Copier après la connexion

notez que A n'implémente pas String() méthode, donc fmt.Println(a) imprime sa représentation native. Mettre à jour String() pour chaque nouveau champ dans une structure peut être fastidieux.

Malheureusement, ce comportement est inhérent au package fmt. Cependant, une fonction d'assistance utilisant la réflexion peut résoudre ce problème :

func PrintStruct(s interface{}, names bool) string {
    v := reflect.ValueOf(s)
    t := v.Type()
    // To avoid panic if s is not a struct:
    if t.Kind() != reflect.Struct {
        return fmt.Sprint(s)
    }

    b := &bytes.Buffer{}
    b.WriteString("{")
    for i := 0; i < v.NumField(); i++ {
        if i > 0 {
            b.WriteString(" ")
        }
        v2 := v.Field(i)
        if names {
            b.WriteString(t.Field(i).Name)
            b.WriteString(":")
        }
        if v2.CanInterface() {
            if st, ok := v2.Interface().(fmt.Stringer); ok {
                b.WriteString(st.String())
                continue
            }
        }
        fmt.Fprint(b, v2)
    }
    b.WriteString("}")
    return b.String()
}
Copier après la connexion

Cette fonction utilise la réflexion pour parcourir les champs de structure et appeler leurs méthodes String() si disponibles.

Utilisation :

fmt.Println(PrintStruct(a, true))
Copier après la connexion

Facultativement, ajoutez une méthode String() à la structure qui appelle PrintStruct() :

func (a A) String() string {
    return PrintStruct(a, true)
}
Copier après la connexion

Maintenant, les champs de structure avec String() seront imprimés automatiquement.

Remarques :

  • Exporter tous les champs privés pour les rendre accessibles à la réflexion.
  • Ajoutez des noms de champs pour une meilleure lisibilité (mais c'est facultatif).
  • Cette approche fonctionne même si la valeur n'est pas une structure, ce qui la rend polyvalente.

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