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

Create variable of type Map[string]interface{} in gRPC protoc buffer golang

我正在使用 grpc golang 在客户端和服务器应用程序之间进行通信。 下面是协议缓冲区的代码。

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

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

虽然处理起来有点冗长,但协议缓冲区中的 "struct" 类型可能更接近于 golang 的 map[string]interface{}

但是像 interface{} 一样,需要一些反射式的开销来确定实际存储的类型是什么。

例如,请参阅此处的评论:https://github.com/golang/protobuf/issues/370

wrote 关于如何使用 google.protobuf.Struct 处理任意 JSON 输入的较长 post。 structpb 包能够通过其 AsMap() 函数从 structpb.Struct 生成 map[string]interface{}

官方文档:https://pkg.go.dev/google.golang.org/protobuf/types/known/structpb