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 :
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!