指针的指针问题
本地跑的好好的,测试环境跑的好好,预发布环境(准线上环境),跪了。
起因就是:
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)标签:Bar,嵌套,json,版本,go,golang1.6,foo,指针 From: https://www.cnblogs.com/supermarx/p/17358601.html