2017-10-24 8 views
0

두 개의 구조체가 있고 그 중 하나는 protobuf로 만들어지고, 다른 하나는 xorm의 테이블 구조체로 만들어집니다.Go에서 구조체를 비슷한 구조체로 변환하는 방법

[] * UserResult가 필요한 기능이 있지만 [] * Users 만 있습니다.

어떻게 변형합니까?

//user.proto => 
message UserResult { 
    int64 uid = 1 ; 
    string name = 2 ; 
} 
//user.go 
type User struct { 
    uid int64 
    name string 
} 
func GetUserList(){ 
    var users []*User 
    return xorm.xxxx.Get(&users) 
} 

// server.go 
func (s *server)GetUserList() ([]*UserRequest , error) { 
    users := model.GetUsers() 
    // here how to make users ---> []*UserRequest ??? 
} 

답변

2

사용 for 루프 :

var userRequests []* UserRequest 
users := model.GetUsers() 
for _, u := range users { 
    ur := &UserRequest{name:u.Name, uid:u.uid, etc...} 
    userRequests = append(userRequests,ur) 
} 

당신은 함수 NewUserRequest (U)를 사용할 수있는 대신에이 같은 UR 인라인를 구성. UserRequest를 표시하지 않았으므로 필드를 필드에 적용해야합니다.

+0

두 구조체의 형식 레이아웃과 필드 이름이 같은 경우 필드 별 어셈블리를 수행 할 필요가 없으므로 직접 형식 변환 할 수 있습니다 (https : //play.golang). org/p/FqR0-W-BF7 – Kaedys

0

(user.proto)에서 생성 된 항목에는 JSON 주석이 있어야합니다. JSON 주석을 user.go에 유형을 추가하여 User을 마샬링하고 UserRequest으로 마샬링하거나 그 반대로 연결할 수 있습니다. 이 방법은 JSON 마샬링에 많은 불필요한 CPU를 사용하고 수집 할 가비지를 많이 생성하므로 성능이 좋지 않습니다. 그러나 많은 필드가 있거나 하나가 많이 변경되는 유형에는 쉽게 수행 할 수 있습니다.

또 다른 접근법은 reflection을 사용하는 것입니다. 이렇게하면 동일한 필드가있는 두 유형간에 변환 할 수 있습니다. JSON보다 약간 빠르지 만 두 함수를 변환하는 함수만큼 빠르지는 않습니다.

+0

필드 이름이 동일하면 JSON 주석이 필요하지 않습니다 (JSON은 기본적으로 대/소문자 구분 필드 이름을 사용하고 일치하는 항목이없는 경우 대/소문자를 구분하지 않습니다) 분야 명). 문제는 현재 필드가 아닌 필드를 내 보내야한다는 것입니다. – Kaedys