V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  cby0414  ›  全部回复第 2 页 / 共 2 页
回复总数  24
1  2  
2020-08-12 21:38:55 +08:00
回复了 bayun2 创建的主题 酷工作 [杭州/成都 Longbridge] IOS-macOS-前端-Go 开发招人啦
请问在成都的地址是哪?
简单的跟了一下 unmarshal,在 1.14.4 版本情况下:
encoding/json/decode.go:620 行开始
1. 622 行的 indirect 函数开始找实现了 unmarshaler 的结构,对应你的代码就是找到了 IdArr,然后停止
2. 然后进入了 623 行的判断,读到本层 json 结构开始的数组下标
3. 注意,624 行的 d.skip() 函数,将当前读取[]byte 的下标跳到了本层 json 结构结束的地方,对应楼主的代码就是跳到了这个 json 文本结束的位置
4. 跳出后由于 d (记录解析状态的结构体)保存的读取下标已经到了 json 文本的结束,所以结束了 unmarshal

json 库代码在实现了 unmarshaler 的情况下 unmarshal 逻辑:unmarshal 时扫描 json 文本,由于实现了 unmarshaler 接口,在库代码里,作者应该是默认 unmarshaler 会完整的自行反序列化对应的 struct,所以在库代码中这里在检测到实现了 unmarshaler 接口后,下次开始的下标就直接跳过了本层 json 结构(跳过目前开始位置的 depth 后的结构),交由 unmarshaler 实现的接口去实现。

所以楼主的代码的问题就是:ids 和 more 是一个层级的,由于实现了 unmarshaler,unmarshal 时就将 ids 和 more 这同一层级的数据[]byte 都交由 IdArr 的 unmarshal 方法去进行,但是楼主实现的 unmarshal 只反序列化了 ids 而没有去实现 more,在跳出后,由于扫描的下标已经跳到了 json 文本的结尾,所以直接结束了 unmarshal 。

归根到底就是库代码作者觉得你实现了某个 unmarshaler 就把这一 depth 的都交给你去自行实现然后跳过这一 depth,而作者只是实现了部分数据的 unmarshal,所以导致了问题。
试用了一下挺好用的👍
2020-03-31 11:53:57 +08:00
回复了 justin2018 创建的主题 分享发现 招商银行活动 充值 10 块 理论上 100% 5 块钱话费红包
感谢嫖到 5 元
1  2  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5377 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 15ms · UTC 07:56 · PVG 15:56 · LAX 23:56 · JFK 02:56
Developed with CodeLauncher
♥ Do have faith in what you're doing.