我有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 ???
}
答案 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快一点,但不如在两者之间转换的函数快。