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 反序列化反而成功了,不是很理解。
1
reus 2020-04-02 15:58:58 +08:00 1
p 是 nil,所以报错
&p 不是 nil,所以成功 |
2
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,所以不报错。 |
3
janxin 2020-04-02 16:00:35 +08:00
报错信息有的啊,因为是 nil...
|
4
brzhang 2020-04-02 20:54:45 +08:00 via iPhone
问一个问题,空值一定是 nil 吗?
|