Golang의 특정 필드를 기반으로 구조체 조각을 효율적으로 그룹화하고 합산하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2024-11-02 20:47:03
원래의
383명이 탐색했습니다.

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

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 필드별로 레지스터를 그룹화한 다음 관련 Money 필드를 합산하는 것입니다.

해결책

제공된 솔루션에는 구조체 유형의 약간의 리팩토링이 포함됩니다. 키 필드를 별도의 구조체인 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
}
로그인 후 복사

그룹화 및 합산

그룹화 및 합산을 달성하기 위해 맵[Key]int를 생성합니다. 맵의 Key는 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은 레지스터의 그룹화 및 합산 표현을 제공합니다.

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
로그인 후 복사

장점

이 접근 방식은 여러 가지 장점을 제공합니다.

  • 단순화 맵을 사용한 그룹화 및 합산
  • 비교 가능한 구조체를 활용하여 데이터를 효율적으로 처리
  • Key 구조체를 사용하여 다양한 그룹화 기준을 처리하는 유연성

위 내용은 Golang의 특정 필드를 기반으로 구조체 조각을 효율적으로 그룹화하고 합산하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿