grpc protobuf使用字符串

时间:2019-08-19 07:41:42

标签: go

我正在使用微框架开发新项目,并且我已经完成了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

1 个答案:

答案 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)

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