blog

골랑에서 두 목록 간의 데이터 일치 최적화하기

골랑을 사용하여 비즈니스 데이터 어셈블리를 처리 할 때 두 목록 간의 데이터 매칭이 자주 발생할 수 있습니다. 많은 초보 프로그래머가 중첩 된 for를 사용하여 매칭하는 것을 좋아...

Oct 16, 2025 · 2 min. read
シェア

운영 컨텍스트:

사용자 테이블에 사용자 필드가 많으므로 필드를 인덱스 테이블용과 모델링된 세부 정보 테이블용 두 개로 분할합니다.

한 목록은 사용자의 사용자 아이디이고 다른 목록은 사용자 아이디와 함께 사용자 세부 정보입니다;

이제 세부 정보에 해당하는 데이터를 연결해야 합니다.

type UserBaseInfo struct {
 UserId int64
 UserName string
 Gender int32
 RegType int32
 Avatar string
 Level int32
}
// 사용자 게시물 정보
type UserArticleInfo struct {
 UserId int64
 ArticleId int32
 Bid int32
 Title string
 Body string
 ....
 userInf *UserBaseInfo
}
func GetAuthorInfo(userIds []int64)(resp []*UserArticleInfo){
 var userInf []*UserBaseInfo
 // ... 라이브러리를 확인하여 사용자에 대한 기본 정보 얻기; 를 생성하여 userInf 변수에 넣으세요.
 
 var UserArticleInfo []*UserArticleInfo
 // ... 라이브러리를 확인하여 각 작성자의 게시물에 대한 정보를 UserArticleInfo 슬라이스에 넣으세요.
 
 // 이 시점에서 두 배열에는 이미 콘텐츠가 있지만 기본 사용자 정보를 연결해야 합니다.; 두 배열을 연결하려면 여전히 두 배열의 userId를 일치시켜야 하며, 두 목록의 수가 수만 개이면 데이터 처리의 복잡성은 O입니다.;
 
 for k,v := range UserArticleInfo {
 for x,y := range userInf {
 if v.UserId == y.UserId {
 v.userInf = y
 }
 }
 }
 
 // 예를 들어 위 예제에서 데이터가 많은 경우 처리 속도가 매우 느려집니다.
}

시간 복잡도를 O(n)으로 최적화해야 합니다. 먼저 배열 중 하나를 userId를 키로, UserBaseInfo를 값으로 하는 맵으로 변환합니다.

//  
userBaseData := map[int64]*UserBaseInfo{}
for _,y := range userInf {
 userBaseData[y.UserId] = y
}
// 지도를 사용한 효율적인 조회로 매칭하기
for _,v := range UserArticleInfo {
 if ok,uf := userBaseData[v.UserId];ok {
 v.userInf = uf
 }
}

이를 통해 효율적인 매칭이 가능합니다;

다음은 또 다른 슬라이싱 팁입니다. 루프에서 슬라이스를 수정해야 하는 경우 포인터 슬라이싱을 사용하는 것이 가장 좋습니다.

포인터 구조 분할의 장점은 효율적인 전송, 메모리 절약, 배열 멤버 값을 직접 수정할 수 있다는 점입니다;

이 방법은 프로젝트에서 자주 사용되므로 이 슬라이스 투 맵 연산을 추출하여 공용 함수로 전환해야 합니다.

제네릭에 대해 골랑을 지원하는 go 버전이 필요합니다:

// SliceToMap 매핑할 유형 슬라이스 지정
func SliceToMap[T comparable, V any](list []V, keyName string) map[T]V {
 data := map[T]V{}
 for _, v := range list {
 valof := reflect.ValueOf(v)
 //fmt.Printf("typeof: %+v
", valof.Kind())
 if valof.Kind().String() == "ptr" {
 valof = valof.Elem()
 }
 item := valof.FieldByName(keyName)
 if k, ok := item.Interface().(T); ok {
 data[k] = v
 }
 }
 return data
}

사용법:

userBaseMap := SliceToMap[int64](userInf, "UserId") // 반환되는 것은 userId를 키로 하는 맵입니다.

다른 팁이나 더 성과 지향적인 방법이 있다면 언제든지 공유해 주세요.

Read next

리플렛의 geojson

간단한 geojson 파일 리플렛 및 geojson 데이터 직접 로드 리소스를 로드하기 전에 빈 레이어 선언하기 geojson 스타일 설정 간단한 스타일 설정 속성별로 선택적으로 스타일 설정 일반적으로 사용되는 내부 메서드 onEachFea

Oct 16, 2025 · 3 min read