go proto3 生成的文件,微服务接口会过滤掉零值字段,这个有什么好的解决方式吗?
比如我定义了 name age 两个字段,如果 age 是 0 ,name 返回的时候只有 name 字段,这样不太友好。
|      1tairan2006      2022-08-03 13:23:55 +08:00  1 ls *.pb.go | xargs -n1 -IX bash -c 'sed s/,omitempty// X > X.tmp && mv X{.tmp,}' | 
|      2tairan2006      2022-08-03 13:26:39 +08:00  2 或者: import "google.golang.org/protobuf/encoding/protojson" m := protojson.MarshalOptions{EmitUnpopulated: true} resp, err := m.Marshal(w) | 
|  |      3timethinker      2022-08-03 13:28:57 +08:00  1 0 是作为默认值的,可以减少序列化以后的体积大小,当你反序列化以后,创建出来的数据结构里面的 age 字段在没有设置的时候,也是 0 值,所以从结果上来看是没有什么影响的。 | 
|      4dcoder      2022-08-03 13:41:14 +08:00  1 protocol buffer 其实表现力很弱, 自己要额外做很多工作才能用舒服了 | 
|  |      5570956418 OP @timethinker 我这边用 api 请求 rpc server 出来的时候零值的字段是不存在的,我在 server 端打印的时候就发现零值字段没有,是我哪里写的不对吗 | 
|  |      6570956418 OP @tairan2006 第一个我试过不行, 我再试试 可能我哪里写错了,谢谢 | 
|      7tairan2006      2022-08-03 14:13:14 +08:00 @570956418 你直接用 ide 把所有,omitempty 删掉也行 | 
|      8twistedmeadows      2022-08-03 14:18:00 +08:00 如果我没理解错,这是 protobuffer 自己的特性,任何语言版本的 protobuffer 都会这样省略 0 值来减少传输。 可能需要关注你 client 端为什么反序列化出来没有这个字段。按理说,它反序列化时也会把零值自动填回来,该有的字段还是有的。 所以需要你补充解释「 api 请求 rpc server 出来的时候零值的字段是不存在的」 | 
|  |      9570956418 OP @tairan2006 我去掉了,但是零值的字段还是没有, 不知道怎么回事 | 
|      10kalista      2022-08-03 14:31:17 +08:00 没有太理解 op 的意思,猜测是想 print 时候有零值字段?那应该从打印函数着手,我提供一个序列化为 json 的做法 | 
|      11kalista      2022-08-03 14:31:33 +08:00 ```go    var data bytes.Buffer var jsonMarshal = &jsonpb.Marshaler{ EnumsAsInts: false, EmitDefaults: true, Indent: "", OrigName: false, AnyResolver: nil, } err := jsonMarshal.Marshal(&data, pb) if err != nil { return err } ``` | 
|  |      12570956418 OP @tairan2006 好了,谢谢,我在 server 端去掉的,应该在 client 端去掉。是我没理解透彻,谢谢指导 | 
|  |      13570956418 OP  1 @twistedmeadows 好了,谢谢,我在 server 端去掉的,应该在 client 端去掉。是我没理解透彻,谢谢指导 | 
|  |      15czyt      2022-08-03 21:21:27 +08:00 |