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

我是Go和Protobufs的新手,因此这可能是一个非常新手的问题。很抱歉。


我的go项目中有几个包,我想创建一个单独的包,其中包含我所有的.proto(也是.pb.go)文件,然后我可以在任何其他包中导入这些原型文件,以更好地管理我的所有原型文件。


但是当我将我的proto文件移动到一个名为“prototemps”的单独包中,并将“prototemps”导入到另一个名为“reader”的包中时。在reader.go中,我做:


    sensorData := &prototemps.Sensor{}

    err := proto.Unmarshal(msg.Payload(), sensorData) 

它会产生此错误


var sensorData *prototemps.Sensor

cannot 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;

}


慕桂英4014372
浏览 233回答 3
3回答

呼啦一阵风

如果您对protoc-gen-go版本感到满意,您可能只想更改调用位置的导入。我知道有两个选项:goproto.Unmarshal"github.com/golang/protobuf/proto""google.golang.org/protobuf/proto"试试你没有的那个。希望也能帮助别人!

慕田峪4524236

错误消息指出该变量缺少方法。检查生成的文件,这是正确的。在类型上没有这样的方法。sensorDataProtoReflectSensor在我看来,你对不同版本的Go的protobuf有问题。确保使用的版本与用于编组/取消编组的文件的版本相同。*.pb.go现在Go世界中有不同的软件包不兼容,因为有重大的API更改:https://blog.golang.org/protobuf-apiv2如果你从protobuf开始,我肯定会尝试使用新的软件包。确保您遵循的任何介绍都使用您正在使用的软件包。

慕姐4208626

检查你的$GOPATH/bin,看看是否有二进制文件叫做proto-gen-go-grpc如果是这样,请尝试运行以下命令protoc&nbsp;--go_out=.&nbsp;--go-grpc_out=.&nbsp;.proto--go_out只在go lang中生成protobuf,但不会生成gGRPC方法
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go