grpc protobuf 用字符串创建新结构



我正在使用微框架来开发我的新项目,我已经完成了GRPC的工作。但是现在,我需要编写与前端交互的网关。我真的不想写重复的代码,我在pb.go文件中找到了一些代码。

代码定义了一些结构和初始化函数。 如下所示:

type AuthLoginReq struct {
Username             string   `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"`
Password             string   `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized     []byte   `json:"-"`
XXX_sizecache        int32    `json:"-"`
}
func init() {
proto.RegisterType((*AuthLoginReq)(nil), "device.info.provider.service.AuthLoginReq")
}

同时,我发现这篇文章有没有办法从字符串创建结构体的实例?

幸运的是,pb 文件已经为我定义了它,但 protoc 自动生成文件被定义为 nil 指针(*AuthLoginReq)(nil)

api.go

qiniuType := proto.MessageType("device.info.provider.service.AuthLoginReq")
pbValue := reflect.New(qiniuType)
pbStruct := pbValue.Elem().Interface()

当我改变 pbSturct 并没有真正改变,因为是零指针

ctx.ShouldBind(&pbStruct)

pbStruct已经是变化了,但pbValue不是改变。

如何更改pbValue

我对reflect不是很熟悉,知道这是不可能的,但绝对不清楚如何做到这一点。您可能会发现设置自己的注册表会更容易:

registry := map[string]func() interface{}{
"AuthLoginReq": func() interface{} {
return &AuthLoginReq{}
},
}
i := registry["AuthLoginReq"]()
a := i.(*AuthLoginReq)
a.Username = "root"
fmt.Printf("%#vn", a)

https://play.golang.org/p/CDIIF69CpUd

最新更新