Maison >développement back-end >Golang >Comment personnaliser l'impression des structures Go sans définir explicitement une méthode String() pour chaque structure ?

Comment personnaliser l'impression des structures Go sans définir explicitement une méthode String() pour chaque structure ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-08 16:49:11260parcourir

How to Customize the Printing of Go Structs Without Explicitly Defining a String() Method for Each Struct?

Impression de structures avec un formatage de champ personnalisé

Bien que fmt.Println affiche de manière pratique les types intégrés, son comportement pour les structures peut être verbeux et peu informatif. Considérons une structure représentant une valeur temporelle avec des champs supplémentaires :

type A struct {
    t time.Time
}

L'impression de cette structure à l'aide de fmt.Println entraîne :

{{63393490800 0 0x206da0}}

ce qui n'est pas facilement interprétable. Plus précisément, la structure ne dispose pas d'une méthode String(), ce qui empêche ses champs d'être formatés comme souhaité.

Problème :

Comment pouvons-nous imprimer une structure avec une chaîne personnalisée représentations pour ses champs, sans définir explicitement une méthode String() pour chacun struct?

Solution :

La réflexion peut être utilisée pour parcourir les champs d'une structure et appeler dynamiquement leurs méthodes String(). Voici une fonction d'assistance qui accomplit cela :

func PrintStruct(s interface{}, names bool) string {
    v := reflect.ValueOf(s)
    t := v.Type()
    // Handle non-struct input
    if t.Kind() != reflect.Struct {
        return fmt.Sprint(s)
    }
    // Initialize buffer
    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(":")
        }
        // Handle Stringer fields
        if v2.CanInterface() {
            if st, ok := v2.Interface().(fmt.Stringer); ok {
                b.WriteString(st.String())
                continue
            }
        }
        // Print non-Stringer fields
        fmt.Fprint(b, v2)
    }
    b.WriteString("}")
    // Return formatted string
    return b.String()
}

Utilisation :

Cette fonction peut être utilisée pour imprimer une structure avec un formatage de champ personnalisé :

a := A{time.Now()}
fmt.Println(PrintStruct(a, true)) // Display field names
fmt.Println(PrintStruct(a, false)) // Omit field names

Remarques :

  • Le La fonction PrintStruct suppose des champs de structure exportés.
  • Pour plus de commodité, vous pouvez définir une méthode String() pour votre structure qui appelle simplement PrintStruct :

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

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