问题
之前总想着总结下Unmarshal的源码流程,但一直被懒惰和忙碌拖着。今天看同事代码发现一个奇怪的代码:
message := new(Message)
if err = json.Unmarshal(messageBody, &message); err != nil {
return
}
惊呆之余,我又开始怀疑自己是不是没注意这中用法。随即翻开go源码开始疯狂搜索。。。(疑惑中)
验证
先写几个demo看下吧
验证Unmarshal01输出结果:
验证结果从结果看不论是传入指针还是传入变量指针的指针,甚至三重指针都不妨碍解析。
想了解为何强类型语言go怎么允许这种操作呢?看源码吧
终于看明白了。解析指针是没有意义的,它会追溯到可以最终存储的数据类型变量才结束。所以多重指针也是找最终的非指针类型变量。
总结
json中的unmarshal使用很多用法及“陷阱”,之前开发遇到了很多问题来不及记录。后续有时间好好总结下unmarshal.
网友评论