Protobuf字符串键映射:驼峰与下划线转换及多端适配问题
Protobuf string类型Map键的命名转换问题
核心结论
Protobuf 不会自动对map<string, ...>的键做驼峰式(camelCase)和下划线式(snake_case)的转换。因为map的键属于业务自定义的字符串数据,不属于Protobuf消息的字段定义——Protobuf的命名转换规则只针对消息的字段名(比如proto里的snake_case字段会生成Go里的CamelCase变量),但不会处理map内部的键值对。
TypeScript/GraphQL层的写法选择
必须使用**"my_attr"作为键**,也就是第二种写法:
myMessage: MyMessage = { data: { "my_attr": "hello", }, }
原因很直接:你传入的map键会原封不动传递到Go后端,若用myAttr,后端拿到的键就是字符串"myAttr",而Go代码里是用"my_attr"取值,自然找不到对应的值。
Go后端侧的问题
你的Go代码存在语法错误:Go语言中map取值返回的是「值+布尔值(表示键是否存在)」,而非「值+错误」。正确写法应为:
myAttr, ok := myMessage.Data["my_attr"] if !ok { // 处理键不存在的逻辑,比如返回默认值或报错 }
按原代码编写会触发编译器报错,因为err的实际类型是bool,并非error类型,这是需要修正的点。
内容的提问来源于stack exchange,提问作者limasxgoesto0
相关产品推荐
相关产品推荐

