为了账号安全,请及时绑定邮箱和手机立即绑定

从不同的包导入原型文件会导致“缺少方法原型反射”

从不同的包导入原型文件会导致“缺少方法原型反射”

Go
慕桂英4014372 2022-08-01 11:07:13
我是Go和Protobufs的新手,因此这可能是一个非常新手的问题。很抱歉。我的go项目中有几个包,我想创建一个单独的包,其中包含我所有的.proto(也是.pb.go)文件,然后我可以在任何其他包中导入这些原型文件,以更好地管理我的所有原型文件。但是当我将我的proto文件移动到一个名为“prototemps”的单独包中,并将“prototemps”导入到另一个名为“reader”的包中时。在reader.go中,我做:    sensorData := &prototemps.Sensor{}    err := proto.Unmarshal(msg.Payload(), sensorData) 它会产生此错误var sensorData *prototemps.Sensorcannot use sensorData (variable of type *prototemps.Sensor) as protoreflect.ProtoMessage value in argument to proto.Unmarshal: missing method ProtoReflect以下是我的项目结构:ProjectFolder/ /prototemps/<all .proto and .pb.go exist here>  (Package "prototemps") /reader/reader.go which fails when tries to do proto.Unmarshall (Package "reader")这是我的 .proto 的样子syntax="proto3";package prototemps;import "google/protobuf/timestamp.proto";message sensor {      string Name = 1;      int32 ID = 2;      string Type = 3;      orientation Ori = 4;      IO IO = 5;      google.protobuf.Timestamp ts = 6;}message orientation {      int32 X = 1;      int32 Y = 2;      int32 Z = 3;}message IO {      int32 Reads = 1;      int32 Writes = 2;}
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

如果您对protoc-gen-go版本感到满意,您可能只想更改调用位置的导入。我知道有两个选项:goproto.Unmarshal

  • "github.com/golang/protobuf/proto"

  • "google.golang.org/protobuf/proto"

试试你没有的那个。希望也能帮助别人!


查看完整回答
反对 回复 2022-08-01
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

错误消息指出该变量缺少方法。检查生成的文件,这是正确的。在类型上没有这样的方法。sensorDataProtoReflectSensor

在我看来,你对不同版本的Go的protobuf有问题。确保使用的版本与用于编组/取消编组的文件的版本相同。*.pb.go

现在Go世界中有不同的软件包不兼容,因为有重大的API更改:https://blog.golang.org/protobuf-apiv2

如果你从protobuf开始,我肯定会尝试使用新的软件包。确保您遵循的任何介绍都使用您正在使用的软件包。


查看完整回答
反对 回复 2022-08-01
?
慕姐4208626

TA贡献1852条经验 获得超7个赞

检查你的$GOPATH/bin,看看是否有二进制文件叫做proto-gen-go-grpc

如果是这样,请尝试运行以下命令

protoc --go_out=. --go-grpc_out=. .proto

--go_out只在go lang中生成protobuf,但不会生成gGRPC方法


查看完整回答
反对 回复 2022-08-01
  • 3 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信