鉴于以下原型,并假设除非绝对必要,否则我们不会进行更新:
message MyMessage {
map<string, string> data = 1
}
在Go后端,我打算通过以下方式读取数据:
myAttr, err := myMessage.Data["my_attr"]; err != nil {
// do stuff
}
在我们的typescript/graphql层上,我应该如何输入这个
"my_attr"
键?难道是……
myMessage: MyMessage = {
data: {
myAttr: "hello",
},
}
或者应该是
myMessage: MyMessage = {
data: {
"my_attr": "hello",
},
}
同样,Go 后端有什么问题吗?
没有转换。
映射字段由协议缓冲区定义键入。
在您的示例中,
data
映射的键和值是string
。
无论您为键和值提供什么值都将保持不变。
package main
import (
"log/slog"
"os"
pb "path/to/protos"
"google.golang.org/protobuf/encoding/protojson"
)
const (
key string = "my_attr"
)
func main() {
myMessage := &pb.MyMessage{
Data: map[string]string{key: "hello"},
}
slog.Info("Output", "MyMessage", myMessage)
myAttr, ok := myMessage.Data[key]
if ok {
slog.Info("Output", key, myAttr)
}
j, err := protojson.Marshal(myMessage)
if err != nil {
slog.Error("unable to marshal myMessage", "err", err)
os.Exit(1)
}
slog.Info("Output", "JSON", string(j))
}
产量: `
Output MyMessage="data:{key:\"my_attr\" value:\"hello\"}"
Output JSON="{\"data\":{\"my_attr\":\"hello\"}}"
注意:当通过 2 值赋值访问映射值时,第二个值是布尔值(不是
error
类型,而是传统的 ok
类型),指示键是否存在于映射中。