刚开始使用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
答案 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)
运算符超越它,但这不是一个好方法
_