Impression de structures avec des représentations de champs personnalisées
Dans Go, l'impression d'une structure directement à l'aide de fmt.Println affiche sa représentation native. Pour contourner cette limitation et imprimer les représentations sous forme de chaîne des champs de structure individuels, une approche consiste à implémenter des méthodes String() personnalisées pour chaque structure. Cependant, cette méthode devient lourde à mesure que la complexité de la structure augmente et nécessite une mise à jour constante à mesure que des champs sont ajoutés ou supprimés.
Une solution basée sur la réflexion
Pour relever ce défi, nous peut exploiter la puissance de la réflexion (en utilisant le package Reflect) pour parcourir dynamiquement les champs d'une structure et invoquer ses méthodes String() si disponible.
func PrintStruct(s interface{}, names bool) string { v := reflect.ValueOf(s) t := v.Type() 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 d'assistance nous permet d'imprimer les champs d'une structure comme suit :
a := A{time.Now(), 2, "hi!"} fmt.Println(PrintStruct(a, true))
Simplifier davantage avec une méthode de chaîne personnalisée
Pour simplifier davantage les structures d'impression, nous pouvons définir une méthode String() qui délègue simplement à PrintStruct() function :
func (a A) String() string { return PrintStruct(a, true) }
Avec cette approche, nous n'avons plus besoin de modifier la méthode String() à chaque fois que nous changeons la structure.
Notes :
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!