Golang gRPC中如何将[]db.User转换为*pb.UsersList?
问题
我有两个结构体,一个是自定义的db.User,另一个是gRPC生成的pb.UsersList。尝试返回自定义结构体列表时触发错误:cannot use list (variable of type []db.User) as *pb.UsersList value in return statement,请问如何将[]db.User转换为*pb.UsersList?
自定义User结构体:
type User struct{ Username string `json:"username"` Password string `json:"password"` }
gRPC生成的UsersList结构体:
type UsersList struct { state protoiml.MessageState sizeCache protoiml.SizeCache unknownFields protoiml.UnknownFields User []*User `protobuf:"bytes,1,rep,name=user,proto3" json:"user,omitempty"` }
解决方案
你需要手动遍历[]db.User列表,将每个db.User实例转换为gRPC生成的pb.User(注:你贴的UsersList代码中User字段的[]*User实际应为[]*pb.User,属于gRPC生成的结构体类型),再将转换后的切片赋值给pb.UsersList的User字段,最终返回该结构体的指针。
具体实现步骤:
- 初始化一个
pb.UsersList指针实例 - 遍历你的
[]db.User列表,逐个字段映射生成*pb.User实例 - 将生成的
*pb.User添加到pb.UsersList的User切片中 - 返回
*pb.UsersList类型的实例
示例代码:
// 假设你的db.User列表变量为list pbUsersList := &pb.UsersList{} for _, dbUser := range list { pbUser := &pb.User{ Username: dbUser.Username, Password: dbUser.Password, } pbUsersList.User = append(pbUsersList.User, pbUser) } // 此时pbUsersList为*pb.UsersList类型,可直接返回 return pbUsersList, nil
说明:Go不支持不同结构体类型的切片直接转换,必须手动遍历完成字段映射。gRPC生成的pb.User和你的自定义db.User属于不同类型,只能通过逐个字段赋值的方式完成转换。
内容的提问来源于stack exchange,提问作者TheQQWEETT
相关产品推荐
相关产品推荐

