随笔 - 173,  文章 - 0,  评论 - 0,  阅读 - 10万

指针的指针问题

本地跑的好好的,测试环境跑的好好,预发布环境(准线上环境),跪了。

起因就是:

1 a := &struct{s:""}
2 json.Unmarshal([]byte{}, &a)
3 fmt.Println(a.s) //报错行

第一行代码进行 &取地址,获得指针变量。

第二行代码,进行json解析的时候,传入了&a, 指针的指针,a到了json包实际为: **a。

在第三行代码,go版本1.6环境中,会报错,panic。

内容为:

1 ····
2 PANIC:runtime error: invalid memory address or nil pointer dereference 
3 ····

空指针报错。

这个好解决

1 1 a := &struct{s:""}
2 2 json.Unmarshal([]byte{}, a) //直接传入即可 不再进行获取指针的动作从而造成指针的指针
3 3 fmt.Println(a.s) //报错行

 

关于嵌套指针丢失指针的问题

在Golang的1.6版本中,使用encoding/json包解析指针的指针时会出现错误。原因是1.6版本的编码器无法正确处理指针的指针,会导致在编码和解码过程中丢失一层指针。

而在新版本的Golang(1.7+)中, encoding/json包已经改进,可以自动处理指针的指针,不需要特殊处理。

所以总结来说,对于Golang 1.6版本处理指针的指针JSON编码问题,

有两种解决方案:

1. 升级Golang版本到1.7+,encoding/json包会自动处理指针的指针。

2. 在1.6版本使用NewEncoder和NewDecoder,设置SetEscapeHTML(false),手动管理指针层级。

关于2的解决方案:

例如,有如下结构:
1 go
2 type Foo struct {
3     Bar *Bar
4 }
5 
6 type Bar struct {
7     Baz string 
8 }

 

如果有如下数据:
1 go
2 bar := &Bar{"hello"}
3 foo := &Foo{bar} 
进行JSON编码后:
1 go
2 data, _ := json.Marshal(foo)
3 // 输出 {"Bar":{"Baz":"hello"}}
解码后:
1 go 
2 var foo Foo
3 json.Unmarshal(data, &foo)
4 // foo.Bar.Baz 输出 hello
5 // 但此时 foo.Bar 不是原来的指针,丢失了一层指针

 

为了解决这个问题,在1.6版本中,可以使用encoding/json中的Encoder和Decoder,并设置Encoder.SetEscapeHTML(false),手动管理指针。例如:
复制代码
 1 go
 2 enc := json.NewEncoder(os.Stdout)
 3 enc.SetEscapeHTML(false) 
 4 enc.Encode(foo) // 输出 {"Bar":{"*":{"Baz":"hello"}}}
 5 
 6 var foo Foo 
 7 dec := json.NewDecoder(os.Stdin)
 8 dec.Decode(&foo)
 9 // 此时foo.Bar是一个指针,需要手动取值
10 foo.Bar = foo.Bar.(*Bar) 
复制代码
posted on   黑熊一只  阅读(97)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2020-04-27 反转链表-PHP的实现
2020-04-27 链表数据-PHP的实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示