首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Go中实现结构到相似结构的转换

如何在Go中实现结构到相似结构的转换
EN

Stack Overflow用户
提问于 2017-10-24 16:48:50
回答 2查看 1.7K关注 0票数 0

我有两个结构,其中一个是由protobuf构成的,另一个是由xorm`s的表结构构成的。

有一个函数需要[]*UserResult,但我只有[]*个用户。

我该如何转换它们呢?

代码语言:javascript
复制
//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 ???
} 
EN

回答 2

Stack Overflow用户

发布于 2017-10-24 16:58:00

使用for循环:

代码语言:javascript
复制
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,因此这些字段必须适应您在其中的任何字段。

票数 2
EN

Stack Overflow用户

发布于 2017-10-24 18:53:40

生成的(user.proto)应该有JSON注解。通过向user.go中的类型添加JSON注释,可以对User进行编组并将其解组为UserRequest,反之亦然。请注意,这种方法的性能不是很好(它使用了大量不必要的cpu来封送JSON,并创建了一些垃圾来收集),但是对于具有许多字段或更改很多的类型来说,这种方法很容易做到。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46906014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档