Heim >Backend-Entwicklung >Golang >Wie kann ich Go-Strukturen mit ihren Feldnamen und String()-Methoden einfach drucken?
In diesem Code:
type A struct { t time.Time } func main() { a := A{time.Now()} fmt.Println(a) fmt.Println(a.t) }
Beachten Sie, dass A String() nicht implementiert Methode, also druckt fmt.Println(a) seine native Darstellung. Das Aktualisieren von String() für jedes neue Feld in einer Struktur kann mühsam sein.
Leider ist dieses Verhalten dem fmt-Paket eigen. Allerdings kann eine Hilfsfunktion, die Reflektion verwendet, dieses Problem lösen:
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() }
Diese Funktion verwendet Reflektion, um Strukturfelder zu durchlaufen und deren String()-Methoden aufzurufen, falls verfügbar.
Verwendung:
fmt.Println(PrintStruct(a, true))
Optional können Sie der aufrufenden Struktur eine String()-Methode hinzufügen PrintStruct():
func (a A) String() string { return PrintStruct(a, true) }
Strukturfelder mit String() werden jetzt automatisch gedruckt.
Hinweise:
Das obige ist der detaillierte Inhalt vonWie kann ich Go-Strukturen mit ihren Feldnamen und String()-Methoden einfach drucken?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!