这是我的原型文件:
import "google/protobuf/struct.proto";
service Renderer {
rpc Render(Request) returns (Response) {}
}
message Request {
string template = 1;
string locale = 2;
google.protobuf.Struct variables = 3;
}
在以下函数中:
func (s *Server) Render(
ctx context.Context,
message *Request,
) (*Response, error) {
fmt.Println(message.Variables.AsMap()) // is always empty
return &Response{}, nil
}
即使我将其发送到服务器,变量字段也始终为空:
{
"template": "template_name",
"locale": "pt",
"variables": {
"foo": "bar"
}
}
我期望
variables
包含 foo
作为键,bar
作为值。我做错了什么?万一我做错了,我该怎么做才能实现这一目标?
structpb
。它包含一个不错的例子。
您不能使用下面的 JSON 示例,因为它是一个
map[string]string
,并且这不足以通用来表示动态类型。
variables": {
"foo": "bar"
}
如果您使用
structpb
来生成 {"foo":"bar"}
值:
package main
import (
"log"
"google.golang.org/protobuf/types/known/structpb"
)
func main() {
v, err := structpb.NewValue(map[string]interface{}{
"foo": "bar",
})
if err != nil {
log.Fatal(err)
}
log.Println(v)
}
你会看到它在 Go 中表示为:
struct_value:{
fields:{
key:"foo"
value:{
string_value:"bar"
}
}
}
这是代码中
Server.Render
所期望的 message.Variables
。