我有两个结构,其中一个是由protobuf构成的,另一个是由xorm`s的表结构构成的。
有一个函数需要[]*UserResult,但我只有[]*个用户。
我该如何转换它们呢?
//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 ???
} 发布于 2017-10-24 16:58:00
使用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,因此这些字段必须适应您在其中的任何字段。
发布于 2017-10-24 18:53:40
生成的(user.proto)应该有JSON注解。通过向user.go中的类型添加JSON注释,可以对User进行编组并将其解组为UserRequest,反之亦然。请注意,这种方法的性能不是很好(它使用了大量不必要的cpu来封送JSON,并创建了一些垃圾来收集),但是对于具有许多字段或更改很多的类型来说,这种方法很容易做到。
另一种方法是使用reflection。这将允许您在具有相同字段的任意两种类型之间进行转换。可能比JSON快一点,但没有在两者之间转换的函数快。
https://stackoverflow.com/questions/46906014
复制相似问题