我正在使用grpc golang在客户端和服务器应用程序之间进行通信。 下面是protoc缓冲区的代码。
syntax = "proto3";
package Trail;
service TrailFunc {
rpc HelloWorld (Request) returns (Reply) {}
}
// The request message containing the user's name.
message Request {
map<string,string> inputVar = 1;
}
// The response message containing the greetings
message Reply {
string outputVar = 1;
}
我需要在消息数据结构中创建一个类型为map [string] interface {}的字段inputVar,而不是map [string] string。 我怎样才能实现它? 提前谢谢。
答案 0 :(得分:6)
proto3的类型为Any
import "google/protobuf/any.proto";
message ErrorStatus {
string message = 1;
repeated google.protobuf.Any details = 2;
}
但如果你看一下它的实现,就像
一样message Any {
string type_url = 1;
bytes value = 2;
}
您必须通过使用反射和中间类型来自己定义此类消息。
答案 1 :(得分:0)
虽然处理起来有点冗长,但协议缓冲区中的“struct”类型可能更接近golang的map [string] interface {}
但是像接口{}将需要一些反射式开销来确定实际存储类型是什么。
例如,请参阅此处的评论:https://github.com/golang/protobuf/issues/370
答案 2 :(得分:0)
我wrote撰写了一篇较长的文章,介绍如何使用google.protobuf.Struct
处理任意JSON输入。 structpb
软件包能够通过其map[string]interface{}
函数从structpb.Struct
产生AsMap()
。
官方文档:https://pkg.go.dev/google.golang.org/protobuf/types/known/structpb