我有一些使用谷歌protobuf的代码。这些是源文件:
Proto文件:
syntax = "proto3";
package my_package.protocol;
option go_package = "protocol";
import "github.com/golang/protobuf/ptypes/empty/empty.proto";
...
service MyService {
rpc Flush (google.protobuf.Empty) returns (google.protobuf.Empty);
}
已编译的go文件:
package protocol
import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import google_protobuf "github.com/golang/protobuf/ptypes/empty"
import (
context "golang.org/x/net/context"
grpc "google.golang.org/grpc"
)
...
type MyServiceClient interface {
Flush(ctx context.Context, in *google_protobuf.Empty, opts ...grpc.CallOption) (*google_protobuf.Empty, error)
}
当我最终尝试使用这样的编译服务时:
import (
"golang.org/x/net/context"
pb "myproject/protocol"
google_protobuf "github.com/golang/protobuf/ptypes/empty"
)
...
func Flush(sink pb.MyServiceClient) {
_, err = sink.Flush(context.Background(), *google_protobuf.Empty{})
...
}
我收到以下错误:
无法使用' * google_protobuf.Empty {}' (类型 " myproject / vendor / github.com / golang / protobuf / ptypes / empty" .Empty)as 类型 " myproject的/供应商/ github.com / golang / protobuf的/ ptypes /空" * google_protobuf.Empty
哪些是相同的(他们甚至解析为同一个文件)。我在这里缺少什么?
答案 0 :(得分:2)
您的错误就在这一行:
_, err = sink.Flush(context.Background(), *google_protobuf.Empty{})
*google_protobuf.Empty{}
试图取消引用结构,但是你的函数原型需要一个指向google_protobuf.Empty
的指针。请改用&google_protobuf.Empty{}
。当你最终得到一个真实的数据结构而不是空的时候,你可能会做以下几点:
req := google_protobuf.MyRequestStruct{}
_, err = service.Method(context.Background(), &req)
有关go中指针语法的概述,请参阅tour