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