去protobuf不承认相同的包

时间:2017-12-13 11:57:18

标签: go protocol-buffers

我有一些使用谷歌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

哪些是相同的(他们甚至解析为同一个文件)。我在这里缺少什么?

1 个答案:

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