Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh mengumpulkan dan menjumlahkan sepotong struct dengan cekap berdasarkan medan tertentu di Golang?

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

Barbara Streisand
Barbara Streisandasal
2024-11-02 20:47:03311semak imbas

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
}

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
}

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
}

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]

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)
}

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

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!

Kenyataan:
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