V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
rimutuyuan
V2EX  ›  Go 编程语言

请教一个 go 语言的问题

  •  
  •   rimutuyuan · 2020-04-02 15:43:40 +08:00 · 1681 次点击
    这是一个创建于 1483 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 反序列化反而成功了,不是很理解。

    4 条回复    2020-04-02 20:54:45 +08:00
    reus
        1
    reus  
       2020-04-02 15:58:58 +08:00   ❤️ 1
    p 是 nil,所以报错
    &p 不是 nil,所以成功
    kidlj
        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,所以不报错。
    janxin
        3
    janxin  
       2020-04-02 16:00:35 +08:00
    报错信息有的啊,因为是 nil...
    brzhang
        4
    brzhang  
       2020-04-02 20:54:45 +08:00 via iPhone
    问一个问题,空值一定是 nil 吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5475 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 01:26 · PVG 09:26 · LAX 18:26 · JFK 21:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.