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
장점
이 접근 방식은 여러 가지 장점을 제공합니다.
위 내용은 Golang의 특정 필드를 기반으로 구조체 조각을 효율적으로 그룹화하고 합산하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!