21

I'm using grpc golang to communicate between client and server application. Below is the code for protoc buffer.

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

I need to create a field inputVar of type map[string]interface{} inside message data structure instead of map[string]string. How can I achieve it? Thanks in advance.

Radhika.S
  • 355
  • 1
  • 2
  • 8

3 Answers3

21

proto3 has type Any

import "google/protobuf/any.proto";

message ErrorStatus {
  string message = 1;
  repeated google.protobuf.Any details = 2;
}

but if you look at its implementation, it is simply as

message Any {
  string type_url = 1;
  bytes value = 2;
}

You have to define such a message yourself by possibly using reflection and an intermediate type.

See example application

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

Marsel Novy
  • 1,777
  • 16
  • 23
12

I wrote a longer post about how to use google.protobuf.Struct to work with arbitrary JSON input. The structpb package capable to produce a map[string]interface{} from a structpb.Struct via its AsMap() function.

Official documentation: https://pkg.go.dev/google.golang.org/protobuf/types/known/structpb

F. Norbert
  • 840
  • 11
  • 10
4

While it gets a little verbose to deal with, the "struct" type in protocol buffers is probably closer to golang's map[string]interface{}

But like interface{} will take some reflection-style overhead to determine what the actual stored type is.

for example see comment here: https://github.com/golang/protobuf/issues/370

ptone
  • 884
  • 7
  • 5