json.Unmarshal()如何工作以及如何将其存储在变量中?

时间:2018-02-26 09:54:08

标签: json pointers go unmarshalling

刚开始使用Go,我对我正在关注的教程有一点怀疑。我读到var myArray = [32.4, "bla", 1.44, 0.5, 65.8, "abc"]; var res = myArray.reduce(function(acc, curr){ return acc + (isNaN(curr) ? 0 : curr); }); console.log(res);是某种JSON编码,我的疑问是:Unmarshall为什么我们将编码的主体分配给err = json.Unmarshal(body, &p)以及err如何获取值我无法看到分配给p.Stuff.Fruit的任何内容。

注意:产品是不同的包,其中包含一些类型和数组。*

p

2 个答案:

答案 0 :(得分:1)

  

我怀疑是:err = json.Unmarshal(body, &p)我们为什么要将编码的主体分配给err

你不是。您将body传递给json.Unmarshal()函数,并将其返回值分配给err变量,该变量告诉您​​解组是否失败(或{if}成功{ {1}}是err)。

  

当我无法看到分配给nil的任何内容时,p.Stuff.Fruit如何获得价值

您将p的地址传递给p,因此它有一个指向您变量的指针,因此如果它修改了指向的值(由指针指向) ,它会修改您拥有的相同值(json.Unmarshal())。

见这个简单的例子:

p

输出(在Go Playground上尝试):

func change(p *int) {
    *p = 3
}

func main() {
    var i int
    fmt.Println("Before", i)
    change(&i)
    fmt.Println("After", i)
}

Before 0 After 3 函数中,我们不会向局部变量main()分配任何内容,但我们会将其地址传递给i函数,该函数会修改指向的值,因此如果我们在change()调用后打印i的值,我们会看到其值已更改。

您将change()的地址传递给p,因此它可以修改json.Unmarshal()中存储的值。在引擎盖下,json包使用反射(包reflect)来发现p的运行时类型,并根据传递给它的JSON文档进行修改以进行解析。

答案 1 :(得分:1)

您已使用library(DT) datatable(iris) 地址运算符创建了指向有效负载的指针。现在它将值保存在p指向的地址处。根据Golang规范Unmarshal采用字节格式的数据和接口{}来包装将数据存储在地址中的变量。

  

Unmarshal解析JSON编码的数据并将结果存储在   v指向的值。如果v为nil或者不是指针,则Unmarshal返回   InvalidUnmarshalError。

Unmarshal函数返回错误

&p

这就是它被分配给变量的原因。您可以使用func Unmarshal(data []byte, v interface{}) error var m Message err := json.Unmarshal(b, &m) 运算符超越它,但这不是一个好方法

_