如何在Go中实现将结构转换为类似的结构

时间:2017-10-24 08:48:50

标签: go protocol-buffers grpc

我有2个结构,其中一个是protobuf,另一个是xorm的表结构。

有一个函数需要[] * 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 个答案:

答案 0 :(得分: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)而不是像这样构建你的内联。您还没有显示UserRequest,因此字段必须适应您在那里的任何字段。

答案 1 :(得分:0)

从(user.proto)生成的应该有JSON注释。通过在user.go中为您的类型添加JSON注释,您可以整理User并将其解组为UserRequest,反之亦然。请注意,这种方法效率不高(它使用大量不必要的cpu​​来编组JSON并创建一些垃圾来收集),但是对于具有许多字段或者变化很大的类型来说,这很容易做到。 / p>

另一种方法是使用reflection。这将允许您在具有相同字段的任何两种类型之间进行转换。 可能比JSON快一点,但不如在两者之间转换的函数快。