Während fmt.Println integrierte Typen bequem anzeigt, kann sein Verhalten für Strukturen ausführlich und nicht aussagekräftig sein. Betrachten Sie eine Struktur, die einen Zeitwert mit zusätzlichen Feldern darstellt:
type A struct { t time.Time }
Das Drucken dieser Struktur mit fmt.Println führt zu:
{{63393490800 0 0x206da0}}
was nicht ohne weiteres interpretierbar ist. Insbesondere fehlt der Struktur eine String()-Methode, die verhindert, dass ihre Felder wie gewünscht formatiert werden.
Problem:
Wie können wir eine Struktur mit einer benutzerdefinierten Zeichenfolge drucken? Darstellungen für seine Felder, ohne für jedes explizit eine String()-Methode zu definieren struct?
Lösung:
Reflection kann verwendet werden, um über die Felder einer Struktur zu iterieren und deren String()-Methoden dynamisch aufzurufen. Hier ist eine Hilfsfunktion, die dies erreicht:
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() }
Verwendung:
Diese Funktion kann verwendet werden, um eine Struktur mit benutzerdefinierter Feldformatierung zu drucken:
a := A{time.Now()} fmt.Println(PrintStruct(a, true)) // Display field names fmt.Println(PrintStruct(a, false)) // Omit field names
Anmerkungen:
Für zusätzlichen Komfort können Sie eine String()-Methode für Ihre Struktur definieren, die einfach PrintStruct aufruft:
func (a A) String() string { return PrintStruct(a, true) }
Das obige ist der detaillierte Inhalt vonWie kann ich das Drucken von Go-Strukturen anpassen, ohne explizit eine String()-Methode für jede Struktur zu definieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!