You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:24:32