ホームページ >バックエンド開発 >Golang >Go で構造体のスライスを効率的にグループ化して合計するにはどうすればよいですか?

Go で構造体のスライスを効率的にグループ化して合計するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-05 07:25:02728ブラウズ

How to Efficiently Group and Sum a Slice of Structs in Go?

Go で構造体のスライスをグループ化して合計する

このシナリオでは、8 つの特定のフィールドに基づいて構造体のスライスをグループ化することを目的としています。 SQL クエリと同様に、追加の整数フィールドを合計します。これを実現するには、最初に、構造体を比較し、各項目がハッシュ テーブル内にあるかどうかを繰り返しチェックし、それに応じてフィールドを追加または合計するための Equal 関数を作成することを検討しました。

あなたのアプローチは有効ですが、別の解決策があります。効率性とシンプルさを実現します。キー フィールド (id1 ~ id8) が別の構造体 Key を形成するように型をリファクタリングします。これにより、Go では構造体が同等であるため、Key をマップ キーとして使用できるようになります。

変更された型定義は次のとおりです:

<code class="go">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
}</code>

グループ化して合計を計算するには、マップを使用します[ Key]int. Register.key をマップ キーとして使用し、同じキー (ID) を持つすべてのレジスタを収集します。

<code class="go">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
}</code>

このソリューションは、提供された構造体のスライスをグループ化して合計する簡単で効率的な方法を提供します。追加のライブラリや複雑な反復メカニズムは必要ありません。

以上がGo で構造体のスライスを効率的にグループ化して合計するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。