我正在使用微框架开发新项目,并且我已经完成了GRPC工作。但是现在,我需要编写与前端交互的网关。我真的不想写重复的代码,我在pb.go
文件中找到了一些代码。
该代码定义了一些struct和init函数。如下所示:
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")
}
与此同时,我发现了这篇文章is there a way to create an instance of a struct from a string?。
幸运的是。 pb文件已经为我定义了它,但是protoc自动生成文件已定义为无指针(*AuthLoginReq)(nil)
。
api.go
qiniuType := proto.MessageType("device.info.provider.service.AuthLoginReq")
pbValue := reflect.New(qiniuType)
pbStruct := pbValue.Elem().Interface()
当我更改pbSturct时并没有真正更改,因为它是nil指针
ctx.ShouldBind(&pbStruct)
pbStruct
已经更改。但pbValue
不变。
如何更改pbValue
?
答案 0 :(得分:0)
我对reflect
并不十分熟悉,以至于不可能做到这一点,但是如何做到这一点显然并不明显。您可能会发现设置自己的注册表会更容易:
registry := map[string]func() interface{}{
"AuthLoginReq": func() interface{} {
return &AuthLoginReq{}
},
}
i := registry["AuthLoginReq"]()
a := i.(*AuthLoginReq)
a.Username = "root"
fmt.Printf("%#v\n", a)