【发布时间】:2021-06-04 16:14:52
【问题描述】:
我有一个UnaryServerInterceptor 接收一个req Interface{}。这个req 可以是我的任何一条消息,但在这种情况下,我的所有消息都有一个共同的metadata 子消息。
Protobuf 定义(示例)
message ClientMeta {
string info = 1;
}
message PingRequest {
ClientMeta metadata = 1;
}
message OtherRequest {
ClientMeta metadata = 1;
}
service Blah {
rpc Ping (PingRequest) returns (PingResponse) {}
rpc Other (OtherRequest) returns (OtherResponses) {}
}
拦截器
func (i *authInterceptor) unary() grpc.UnaryServerInterceptor {
return func(
ctx context.Context,
req interface{},
info *grpc.UnaryServerInfo,
handler grpc.UnaryHandler,
) (interface{}, error) {
log.Info().Msgf("interceptor: %s", info.FullMethod)
}
}
我需要在我的拦截器中访问消息metadata 的属性。问题是我不知道它是哪条消息,所以我不能只是投射它。我有几条不同的消息,但它们都有metadata 的共同点。
最好的方法是什么?
【问题讨论】:
-
旁注:Go 没有 casts,但有类型转换、类型切换和类型断言。 T(x)(其中 T 是类型,x 是值)是类型转换; x.(T) 是一个类型断言;
switch x.(type) { ... }是一个类型开关。这个主题有一些小的变化。 gRPC 编译器进行了设置,以便您可以合理干净地使用这些(如在已经接受的答案中)。
标签: go protocol-buffers grpc