在 protobuf 中使用带有字符串键的映射时,键会自动从camelCase转换为snake_case吗?

问题描述 投票:0回答:1

鉴于以下原型,并假设除非绝对必要,否则我们不会进行更新:

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 后端有什么问题吗?

typescript go protocol-buffers protobuf.js protobuf-go
1个回答
0
投票

没有转换。

映射字段由协议缓冲区定义键入。

在您的示例中,

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
类型),指示键是否存在于映射中。

© www.soinside.com 2019 - 2024. All rights reserved.