Go grpc:使用其中一个原因导致无效内存地址或零指针解引用

Go grpc:使用其中一个原因导致无效内存地址或零指针解引用,go,protocol-buffers,grpc,grpc-go,Go,Protocol Buffers,Grpc,Grpc Go,我正试图用Go将proto3结构发送到gRPC服务器。这个结构有一个类型,我似乎很好地填充了它。当向我的gRPC客户端发送消息时,我对无效的内存地址或零指针引用感到恐慌 我有原始定义(完整文件位于: #proto3 消息文档{ 字符串集合=1; 字符串id=2; geo公司之一{ 点=4; 行字符串行=5; 界限=6; 字符串geojson=7; } } 消息点{坐标坐标=1;} 消息坐标{ 双lat=1; 双液化天然气=2; } Go代码为: //创建一个坐标 坐标:=geofunce.坐标

我正试图用Go将proto3结构发送到gRPC服务器。这个结构有一个
类型,我似乎很好地填充了它。当向我的gRPC客户端发送消息时,我对
无效的内存地址或零指针引用感到恐慌

我有原始定义(完整文件位于:

#proto3
消息文档{
字符串集合=1;
字符串id=2;
geo公司之一{
点=4;
行字符串行=5;
界限=6;
字符串geojson=7;
}
}
消息点{坐标坐标=1;}
消息坐标{
双lat=1;
双液化天然气=2;
}
Go代码为:

//创建一个坐标
坐标:=geofunce.坐标{
Lat:10.2,
液化天然气:-15.3,
}
//向点添加坐标
点:=geofunce.point{
协调:&协调,
}
//这些语句打印有效数据
log.Printf(“坐标:%v”,坐标)
log.Printf(“点:%v”,点)
//创建文档,将点添加到oneof字段
文档:=geofunce.document{
收藏:“一些收藏”,
Id:“某个Id”,
地理位置:&点,
}
//这样可以正确打印文档
log.Printf(“文档:%v”,文档)
//连接到客户端
var opts[]grpc.dialpoption
opts=append(opts,grpc.withunsecure())
变量错误
conn,err:=grpc.Dial(“我的服务器:端口”,选项…)
如果错误!=零{
log.Fatalf(“拨号失败:%v”,错误)
}
延迟连接关闭()
客户机:=geofancy.NewGeofancyServiceClient(康涅狄格州)
ctx,cancel:=context.WithTimeout(context.Background(),5*time.Second)
推迟取消
//每次都会感到恐慌
res,err:=client.SetDocument(ctx和document)
堆栈跟踪如下所示:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x10 pc=0x54d731]

goroutine 1 [running]:
my-project/vendor/github.com/golang/protobuf/proto.makeOneOfMarshaler.func1(0xc000068ce0, 0x0, 0x0)
        D:/projects/golang/src/my-project/vendor/github.com/golang/protobuf/proto/table_marshal.go:2373 +0x131
my-project/vendor/github.com/golang/protobuf/proto.(*marshalInfo).size(0xc0003021c0, 0xc000068cc0, 0xf9ef40)
        D:/projects/golang/src/my-project/vendor/github.com/golang/protobuf/proto/table_marshal.go:183 +0xa8
my-project/vendor/github.com/golang/protobuf/proto.(*InternalMessageInfo).Size(0xf9ef40, 0xae7fa0, 0xc000068cc0, 0x30448c0)
        D:/projects/golang/src/my-project/vendor/github.com/golang/protobuf/proto/table_marshal.go:125 +0x6e
my-project/vendor/my-protos.(*Document).XXX_Size(0xc000068cc0, 0xae7fa0)
        D:/projects/golang/src/my-project/vendor/my-protos/geofancy.pb.go:197 +0x4a
my-project/vendor/github.com/golang/protobuf/proto.(*Buffer).Marshal(0xc0002de698, 0xae7fa0, 0xc000068cc0, 0xc0000363f0, 0xc000068cc0)
        D:/projects/golang/src/my-project/vendor/github.com/golang/protobuf/proto/table_marshal.go:2740 +0x8c
my-project/vendor/google.golang.org/grpc/encoding/proto.marshal(0xa0c520, 0xc000068cc0, 0xc0002de690, 0x0, 0x0, 0xc000006000, 0x99a900, 0x1)        
        D:/projects/golang/src/my-project/vendor/google.golang.org/grpc/encoding/proto/proto.go:59 +0xe9
my-project/vendor/google.golang.org/grpc/encoding/proto.codec.Marshal(0xa0c520, 0xc000068cc0, 0x0, 0x2030000, 0x2030000, 0x30000, 0x20)
        D:/projects/golang/src/my-project/vendor/google.golang.org/grpc/encoding/proto/proto.go:74 +0xb4
my-project/vendor/google.golang.org/grpc.encode(0x3080168, 0xfbc400, 0xa0c520, 0xc000068cc0, 0xc000310020, 0xc000362000, 0x11d0008, 0x0, 0x0)       
        D:/projects/golang/src/my-project/vendor/google.golang.org/grpc/rpc_util.go:543 +0x59
my-project/vendor/google.golang.org/grpc.prepareMsg(0xa0c520, 0xc000068cc0, 0x3080168, 0xfbc400, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        D:/projects/golang/src/my-project/vendor/google.golang.org/grpc/stream.go:1501 +0x8c
my-project/vendor/google.golang.org/grpc.(*clientStream).SendMsg(0xc00032e000, 0xa0c520, 0xc000068cc0, 0x0, 0x0)
        D:/projects/golang/src/my-project/vendor/google.golang.org/grpc/stream.go:681 +0x157
my-project/vendor/google.golang.org/grpc.invoke(0xaed320, 0xc000068f60, 0xa42207, 0x25, 0xa0c520, 0xc000068cc0, 0x9e3000, 0xc00003c840, 0xc000065180, 0x0, ...)
        D:/projects/golang/src/my-project/vendor/google.golang.org/grpc/call.go:70 +0xee
my-project/vendor/google.golang.org/grpc.(*ClientConn).Invoke(0xc000065180, 0xaed320, 0xc000068f60, 0xa42207, 0x25, 0xa0c520, 0xc000068cc0, 0x9e3000, 0xc00003c840, 0x0, ...)
        D:/projects/golang/src/my-project/vendor/google.golang.org/grpc/call.go:37 +0x1bb
my-project/vendor/my-protos.(*geofancyServiceClient).SetDocument(0xc000006030, 0xaed320, 0xc000068f60, 0xc000068cc0, 0x0, 0x0, 0x0, 0xc000065180, 0x0, 0x0)
        D:/projects/golang/src/my-project/vendor/my-protos/geofancy.pb.go:925 +0xd9
main.sendMyMessage(0xc0002e4000, 0x77359400)
        D:/projects/golang/src/my-project/main.go:89 +0x685
main.main()
        D:/projects/golang/src/my-project/main.go:117 +0xf4

我很惊讶你的代码正在编译。我非常感兴趣,我在我的环境中生成了Go代码来理解它

“geofunce.Document”结构无法接收
点作为属性Geo的值,因为它需要一个通用的“Document Geo”(可以是Document\u点、Document\u行字符串等)

自动生成的代码有一个在这种情况下可以使用的接口

//向点添加坐标
点:=geofunce.Document\u点{
点:&geofunce.Point{
协调:&协调,
},
}
现在,您的变量
point
是一个结构,它实现了
Geo
可以接受的接口

document:=geofunce.document{
收藏:“一些收藏”,
Id:“某个Id”,
地理位置:&点,
}
我无法使用您的示例进行编译,因为收到错误:

 cannot use &point (type **geofancy.Point) as type geofancy.isDocument_Geo in field value:
    **geofancy.Point does not implement geofancy.isDocument_Geo (missing geofancy.isDocument_Geo method)```

你能分享完整的stacktrace吗?我在Mithunarunana添加了它。我想知道它是否与你的供应商有关。试着删除供应商目录,然后使用所有工具,看看会发生什么。例如,可能你的生成代码和原型库的组合不兼容?