Bagaimanakah saya boleh mengumpulkan dan menjumlahkan sepotong struct dengan cekap berdasarkan medan tertentu di Golang?

Barbara Streisand
Lepaskan: 2024-11-02 20:47:03
asal
413 orang telah melayarinya

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

Pengumpulan dan Penjumlahan Cekap Keratan Struktur di Golang

Di Golang, pengendalian data dengan cekap adalah penting. Apabila berurusan dengan kepingan struktur, tugas seperti mengumpulkan dan menjumlahkan boleh menjadi mencabar. Panduan ini menangani pendekatan yang cekap untuk mengumpulkan dan menjumlahkan sepotong struct berdasarkan medan tertentu.

Pernyataan Masalah

Pertimbangkan struct berikut:

type Register struct {
    id1 int
    id2 int
    id3 int
    id4 int
    id5 int
    id6 int
    id7 int
    id8 int
    money int
}
Salin selepas log masuk

Matlamatnya ialah untuk mengumpulkan daftar mengikut medan id1, id2, id3, id4, id5, id6, id7 dan id8 dan kemudian menjumlahkan medan wang yang berkaitan.

Penyelesaian

Penyelesaian yang disediakan melibatkan pemfaktoran semula sedikit jenis struct. Dengan mengekstrak medan kunci ke dalam struct yang berasingan, Key, kita boleh menggunakan kebolehbandingan struct dalam Golang.

Jenis Refactored

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
}
Salin selepas log masuk

Pengumpulan dan Menjumlahkan

Untuk mencapai pengumpulan dan penjumlahan, kami membuat peta[Key]int. Kunci peta mewakili gabungan medan id, manakala nilai mewakili jumlah wang untuk daftar dengan kunci yang sama.

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
}
Salin selepas log masuk

Output

The peta menyediakan perwakilan berkumpulan dan dijumlahkan bagi daftar.

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]
Salin selepas log masuk

Output Dipertingkat

Untuk kebolehbacaan yang lebih baik, kami boleh memformatkan output seperti berikut:

fmt.Println("Nice output:")
for k, v := range m {
    fmt.Printf("%+3v: %d\n", k, v)
}
Salin selepas log masuk

Hasil

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
Salin selepas log masuk

Kelebihan

Pendekatan ini menawarkan beberapa kelebihan:

  • Diringkaskan mengumpulkan dan menjumlahkan menggunakan peta
  • Pengendalian data yang cekap dengan memanfaatkan struct setanding
  • Fleksibiliti dalam mengendalikan kriteria kumpulan yang berbeza melalui penggunaan struct Kunci

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengumpulkan dan menjumlahkan sepotong struct dengan cekap berdasarkan medan tertentu di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan