Go で構造体のスライスをグループ化して合計する
データを分析するとき、多くの場合、類似した要素をグループ化し、集計値を計算する必要があります。各グループ。 LINQ では、これはメモリ内クエリを使用して効率的に実現できます。 Go は、マップとクロージャを使用して同様の操作を実行する多用途の方法を提供します。
各構造体に複数の一意の識別子 (id1 から id8) と整数値 (money) が含まれる Register 構造体のスライスを考えてみましょう。目標は、これらのレジスタを一意の識別子でグループ化し、各グループに対応する金額を合計することです。
手動でのグループ化と合計:
1 つのアプローチは、カスタム Equal 関数を使用して、識別子に基づいて Register 構造体を比較します。次に、スライスを反復処理して、各レジスタがハッシュ テーブルにすでに存在するかどうかを確認します。そうであれば、貨幣価値が増加します。そうでない場合は、レジスタと初期通貨値 0 を含むハッシュ テーブルに新しいエントリが追加されます。
キー構造体とマップの使用:
Go のマップは、グループ化と合計の操作をより効率的に実行する方法を提供します。一意の識別子 (id1 ~ id8) のみを含む別の 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>
<code class="go">m := map[Key]int{}</code>
<code class="go">for _, v := range regs { m[v.key] += v.money }</code>
出力と書式設定:
結果を適切に表示するには、すべてのフィールドの先頭に id が付いているキー構造体。例:
<code class="go">fmt.Println("Nice output:") for k, v := range m { fmt.Printf("%+3v: %d\n", k, v) }</code>
結論:
主要な構造体でマップを使用することは、Go で構造体のスライスをグループ化して合計するための効率的かつ柔軟な方法です。これは、特に大規模なデータセットを扱う場合に、手動のグループ化と合計に代わるパフォーマンスの高い代替手段となります。
以上がGo でマップとキー構造体を使用して構造体のスライスをグループ化して合計するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。