Heim > Artikel > Backend-Entwicklung > Wie kann ich ein Segment von Strukturen basierend auf bestimmten Feldern in Golang effizient gruppieren und zusammenfassen?
Effiziente Gruppierung und Summierung von Strukturscheiben in Golang
In Golang ist der effiziente Umgang mit Daten von entscheidender Bedeutung. Beim Umgang mit Struktursegmenten können Aufgaben wie das Gruppieren und Summieren zu einer Herausforderung werden. Dieser Leitfaden befasst sich mit einem effizienten Ansatz zum Gruppieren und Zusammenfassen eines Teils von Strukturen basierend auf bestimmten Feldern.
Problemstellung
Bedenken Sie die folgende Struktur:
type Register struct { id1 int id2 int id3 int id4 int id5 int id6 int id7 int id8 int money int }
Das Ziel besteht darin, Register nach den Feldern id1, id2, id3, id4, id5, id6, id7 und id8 zu gruppieren und dann das zugehörige Geldfeld zu summieren.
Lösung
Die bereitgestellte Lösung beinhaltet eine leichte Umgestaltung der Strukturtypen. Durch Extrahieren der Schlüsselfelder in eine separate Struktur, Key, können wir die Vergleichbarkeit von Strukturen in Golang nutzen.
Refactored Types
type Key struct { id1 int id2 int id3 int id4 int id5 int id6 int id7 int id8 int } type Register struct { key Key money int }
Gruppierung und Summieren
Um das Gruppieren und Summieren zu erreichen, erstellen wir eine Map[Key]int. Der Schlüssel der Karte stellt die Kombination von ID-Feldern dar, während der Wert die Geldsumme für Register mit demselben Schlüssel darstellt.
regs := []*Register{ {Key{id1: 345}, 1500}, {Key{id1: 345, id2: 140}, 2700}, {Key{id1: 345, id2: 140}, 1300}, {Key{id1: 345}, 1000}, {Key{id3: 999}, 1000}, {Key{id3: 999}, 2000}, } // calculate sum: m := map[Key]int{} for _, v := range regs { m[v.key] += v.money }
Ausgabe
Die Karte bietet eine gruppierte und summierte Darstellung der Register.
map[{345 0 0 0 0 0 0 0}:2500 {345 140 0 0 0 0 0 0}:4000 {0 0 999 0 0 0 0 0}:3000]
Erweiterte Ausgabe
Zur besseren Lesbarkeit können wir die Ausgabe wie folgt formatieren:
fmt.Println("Nice output:") for k, v := range m { fmt.Printf("%+3v: %d\n", k, v) }
Ergebnis
Nice output: {id1:345 id2: 0 id3: 0 id4: 0 id5: 0 id6: 0 id7: 0 id8: 0}: 2500 {id1:345 id2:140 id3: 0 id4: 0 id5: 0 id6: 0 id7: 0 id8: 0}: 4000 {id1: 0 id2: 0 id3:999 id4: 0 id5: 0 id6: 0 id7: 0 id8: 0}: 3000
Vorteile
Dieser Ansatz bietet mehrere Vorteile:
Das obige ist der detaillierte Inhalt vonWie kann ich ein Segment von Strukturen basierend auf bestimmten Feldern in Golang effizient gruppieren und zusammenfassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!