Wie kann ich ein Segment von Strukturen basierend auf bestimmten Feldern in Golang effizient gruppieren und zusammenfassen?

Barbara Streisand
Freigeben: 2024-11-02 20:47:03
Original
399 Leute haben es durchsucht

How can I efficiently group and sum a slice of structs based on specific fields in Golang?

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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]
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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
Nach dem Login kopieren

Vorteile

Dieser Ansatz bietet mehrere Vorteile:

  • Vereinfacht Gruppieren und Summieren mithilfe von Karten
  • Effiziente Datenverarbeitung durch Nutzung vergleichbarer Strukturen
  • Flexibilität bei der Handhabung verschiedener Gruppierungskriterien durch die Verwendung der Schlüsselstruktur

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage