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
Barbara Streisandoriginal
2024-12-06 15:58:111033parcourir

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

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

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

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

func (a A) String() string {
    return PrintStruct(a, true)
}

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!

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