尽管在golang中匹配参数,为什么我不能将func文字用作自定义函数类型?

时间:2017-05-10 19:30:55

标签: go middleware grpc

google.golang.org/grpc将类型UnaryClientInterceptor定义为:

type UnaryClientInterceptor func(ctx context.Context, method string, req, reply interface{}, cc *ClientConn, invoker UnaryInvoker, opts ...CallOption) error

在我的代码中,我想做类似的事情:

func clientInterceptor() grpc.UnaryClientInterceptor {
    return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
        //intercept stuff
        return invoker(ctx, method, req, reply, cc, opts...)
    }
}

但是我收到了这个错误:

“不能使用func文字(类型为func(”context“.Context,string,interface {},interface {},* grpc.ClientConn,grpc.UnaryInvoker,... grpc.CallOption)error)作为类型grpc。 UnaryClientInterceptor返回参数“

查看Why can I type alias functions and use them without casting?我的印象是,clientInterceptor()中返回的匿名函数应与grpc.ClientInterceptor类型匹配。

另外,根据类型标识(http://golang.org/ref/spec#Type_identity

的规范
  

如果两个函数类型具有相同数量的参数和结果值,相应的参数和结果类型相同,并且两个函数都是可变参数或两者都不是,则它们是相同的。参数和结果名称不需要匹配。

我尝试过铸造和制作grpc.UnaryClientInterceptor类型的变量,但没有任何效果。

我也基本上和grpc.UnaryServerInterceptor完全一样,没有问题。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:5)

您可能引用context包的方式与grpc的版本不同。从Go 1.7开始,包从golang.org/x/net/context移到context,编译器可能不会将它们视为等效。