代码之家  ›  专栏  ›  技术社区  ›  user1050619

golang json解编中的指针

  •  -1
  • user1050619  · 技术社区  · 6 年前

    我正在尝试使用下面的命令取消Web服务响应的标记,它工作正常。

    bodyBytes, _ := ioutil.ReadAll(response.Body)
    bodyString := string(bodyBytes)
    err = json.Unmarshal([]byte(bodyString), &output)
    fmt.Println(&output)
    

    当我使用指针变量“&output”时,它工作正常,即输出显示正确。

    但是当我尝试直接使用不带&和号的变量时,输出看起来不好。

    bodyBytes, _ := ioutil.ReadAll(response.Body)
    bodyString := string(bodyBytes)
    err = json.Unmarshal([]byte(bodyString), output)
    fmt.Println(output)
    

    这两个变量指针与正常变量在解组时的区别是什么?

    var output core.ApiData
    

    输出是与APIData输出匹配的类型结构。

    2 回复  |  直到 6 年前
        1
  •  2
  •   minitauros    6 年前

    这是因为 Unmarshal 函数接受 output 构造并用数据填充它。如果不传递指针,它将获取结构的一个副本并填充它,之后您就不能再访问它了。如果你通过一个指针, 输出 指针后面的结构将被填充并保持可用。

        2
  •  3
  •   Ullaakut    6 年前

    正如你所看到的, json.Unmarshal 不返回值,因此如果传递的是值而不是指针,它将无法正常工作,因为它将填充作为参数的接口副本。

    它的工作方式是将指针传递给要填充的结构,以及 杰森,元帅 将直接使用指针填充它。

    the documentation 了解更多详细信息。

    unmarshal解析JSON编码的数据并将结果存储在 V指向的值 . 如果v为nil或不是指针,unmarshal返回一个invalidUnmarshalError。