Heim >Backend-Entwicklung >Golang >Wie kann ich Go-Strukturen mit ihren Feldnamen und String()-Methoden einfach drucken?

Wie kann ich Go-Strukturen mit ihren Feldnamen und String()-Methoden einfach drucken?

Barbara Streisand
Barbara StreisandOriginal
2024-12-06 15:58:11989Durchsuche

How Can I Easily Print Go Structs with Their Field Names and String() Methods?

Drucken von Strukturen mit Feldstring()s

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:

  • Exportieren alle privaten Felder, um sie für die Reflexion zugänglich zu machen.
  • Fügen Sie Feldnamen hinzu, um die Lesbarkeit zu verbessern (aber es ist optional).
  • Dieser Ansatz funktioniert auch, wenn der Wert keine Struktur ist, was ihn vielseitig macht.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn