在gRPC protoc缓冲区golang中创建Map [string] interface {}类型的变量

时间:2016-10-26 10:16:15

标签: go grpc protoc

我正在使用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。 我怎样才能实现它? 提前谢谢。

3 个答案:

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

您必须通过使用反射和中间类型来自己定义此类消息。

请参阅example application

https://github.com/golang/protobuf/issues/60

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