请教一个 go 语言的问题

2020-04-02 15:43:40 +08:00
 rimutuyuan
type Person struct {
    Name string `json:"name"`
}

var p *Person

s := `{"name": "123"}`
fmt.Println(json.Unmarshal([]byte(s), p))  // 报错
fmt.Println(json.Unmarshal([]byte(s), &p)) // 成功

var 声明变量,p 应该是 nil,为什么取地址 json 反序列化反而成功了,不是很理解。

1802 次点击
所在节点    Go 编程语言
4 条回复
reus
2020-04-02 15:58:58 +08:00
p 是 nil,所以报错
&p 不是 nil,所以成功
kidlj
2020-04-02 15:59:45 +08:00
Unmarshal 第二个参数必须是个指针,而且不能为 nil,但是 p == nil,所以第一个报错。

```
func (d *decodeState) unmarshal(v interface{}) error {
rv := reflect.ValueOf(v)
if rv.Kind() != reflect.Ptr || rv.IsNil() {
return &InvalidUnmarshalError{reflect.TypeOf(v)}
}
...

}
```

至于第二个,&p 是指向 p 变量(本身是个指针)的指针,&p 既是指针,又不是 nil,所以不报错。
janxin
2020-04-02 16:00:35 +08:00
报错信息有的啊,因为是 nil...
brzhang
2020-04-02 20:54:45 +08:00
问一个问题,空值一定是 nil 吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/658686

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX