-
Notifications
You must be signed in to change notification settings - Fork 0
Description
最近辛勤耕耘代码时,遭遇了一件始料未及的状况。
向日志中间件发送请求时,控制台时不时冒出报错信息。这可让我警觉起来,心里直犯嘀咕:“这是何方妖孽再次作怪,让我前去捉拿归案!”
起初粗看请求,地址、路由、方法以及结构体,各个要素都毫无二致。待我沉下心、仔细审视请求返回提示,终于发现了些许 “蛛丝马迹”—— 返回结果提示传入类型不匹配。当时,我不禁脱口而出 “啊!~”,满是诧异。
一番细致比对后,症结浮出水面:代码里明明定义的是 float64 类型,解析结果却成了整数,这着实不合理。带着满心疑惑,我上网查阅资料,原来是因为 JSON 并不区分整数与小数,统统视作 Number 类型,才导致好好的浮点型数据输出成了整型,这可不是我想要的结果。
为解决这一棘手问题,我在程序猿交友网站高强度冲浪🏄。结果发现,不管是Golang自带的encoding/json,还是ByteDance的bytedance/sonic,针对浮点类型都没有对应的配置与额外处理手段,我不禁心生疑问:难道这算是小众需求?内心产生大大的❓
面对这般情形,摆在眼前有两条路:一是自定义类型来处理序列化;二是重写代码,让其支持浮点类型的序列化。考虑到项目里大量使用浮点型数据,我毅然选了后者,却没料到,“折磨” 就此拉开帷幕。
我着手手写Marshal处理方法,上来便按部就班展开操作:先是获取reflect.Type、reflect.Value以及reflect.StructField.Tag,紧接着处理Tag内容、匹配基础类型,各个环节一气呵成。尤其针对浮点类型的json输出文本,我特意做了单独处理,只要数据没有小数部分,就添加上.0,以此确保json文本里的Number类型能被正确识别为浮点型。完成编写后,跑测试用例,嘿,一次性通过,生成的json文本也符合预期,当时满心欢喜,立马进行 git 三连操作(add、commit、push)
然而,好景不长。随着项目推进,结构体里不仅要处理 time.Time 类型,还涉及诸多其他复杂类型。我那手写、维护并不周全的Marshal方法,渐渐显得力不从心,维护难度愈发攀升。日复一日,我在这 “泥潭” 里挣扎,直至精疲力竭,实在无力继续维护,无奈之下,只好调整回使用原生 encoding/json 搭配自定义类型的方式处理序列化,至此,这场 “折腾” 才算画上句号。