Golang での構造体スライスの効率的なグループ化と合計
Golang では、データを効率的に処理することが重要です。構造体のスライスを扱う場合、グループ化や合計などのタスクが困難になる可能性があります。このガイドでは、特定のフィールドに基づいて構造体のスライスをグループ化して合計するための効率的なアプローチについて説明します。
問題ステートメント
次の構造体について考えてみましょう:
type Register struct { id1 int id2 int id3 int id4 int id5 int id6 int id7 int id8 int money int }
目標は、フィールド id1、id2、id3、id4、id5、id6、id7、および id8 によってレジスターをグループ化し、関連する金額フィールドを合計することです。
解決策
提供されるソリューションには、構造体型のわずかなリファクタリングが含まれます。キー フィールドを別の構造体 Key に抽出することで、Golang の構造体の比較可能性を利用できます。
リファクタリングされた型
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 }
グループ化とSumming
グループ化と合計を行うために、map[Key]int を作成します。マップのキーは ID フィールドの組み合わせを表し、値は同じキーを持つレジスターの合計金額を表します。
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 }
出力
マップは、レジスタのグループ化および合計表現を提供します。
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]
拡張出力
読みやすさを向上させるために、出力を次のようにフォーマットできます:
fmt.Println("Nice output:") for k, v := range m { fmt.Printf("%+3v: %d\n", k, v) }
結果
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
利点
このアプローチにはいくつかの利点があります。
以上がGolang の特定のフィールドに基づいて構造体のスライスを効率的にグループ化して合計するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。