Wie können Programmierer strukturierte Datenausgaben generieren, indem sie Felder in alphabetischer Reihenfolge anzeigen? Beachten Sie insbesondere Folgendes:
type T struct { B int A int } t := &T{B: 2, A: 1} doSomething(t) fmt.Println(t) // Desired output: &{1 2} — Fields sorted alphabetically
Lösung durch Feldreihenfolge:
Standardmäßig behalten Strukturen die deklarierte Feldreihenfolge bei. Somit kann durch Neudefinition der Struktur mit der gewünschten Feldsequenz die Ausgabe erhalten werden:
type T struct { A int B int }
Lösung über Stringer-Schnittstelle:
Ein anderer Ansatz beinhaltet die Implementierung des Stringers Schnittstelle für die Struktur:
func (t T) String() string { return fmt.Sprintf("{%d %d}", t.A, t.B) }
Das fmt-Paket sucht nach der Stringer-Implementierung und verwendet seine String()-Methode für die Ausgabe Generation.
Lösung durch Reflexion:
Für Flexibilität über Strukturen hinweg kann Reflexion genutzt werden. Feldnamen können abgerufen, sortiert und die entsprechenden Werte abgerufen werden.
func printFields(st interface{}) string { t := reflect.TypeOf(st) names := make([]string, t.NumField()) for i := range names { names[i] = t.Field(i).Name } sort.Strings(names) v := reflect.ValueOf(st) buf := &bytes.Buffer{} buf.WriteString("{") for i, name := range names { val := v.FieldByName(name) if !val.CanInterface() { continue } if i > 0 { buf.WriteString(" ") } fmt.Fprintf(buf, "%v", val.Interface()) } buf.WriteString("}") return buf.String() }
Das obige ist der detaillierte Inhalt vonWie können Programmierer die Ausgabe von Strukturfeldern in Go alphabetisch ordnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!