운영 컨텍스트:
사용자 테이블에 사용자 필드가 많으므로 필드를 인덱스 테이블용과 모델링된 세부 정보 테이블용 두 개로 분할합니다.
한 목록은 사용자의 사용자 아이디이고 다른 목록은 사용자 아이디와 함께 사용자 세부 정보입니다;
이제 세부 정보에 해당하는 데이터를 연결해야 합니다.
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를 키로 하는 맵입니다.
다른 팁이나 더 성과 지향적인 방법이 있다면 언제든지 공유해 주세요.





