我注意到,非常偶然,我可以成功地将一个指针指向一个结构体,并且指向一个指向结构体的指针指向json.Unmarshal()
,两者都可以正常工作:json.Unmarshal()接受一个指针指针
package main
import (
"testing"
"encoding/json"
)
type Person struct {
Name string
Age int
}
func TestMarshaling(t *testing.T) {
foo := &Person{Name: "bob", Age: 23}
// marshal it to bytes
b, err := json.Marshal(foo)
if err != nil {
t.Error(err)
}
bar := &Person{} // pointer to new, empty struct
err = json.Unmarshal(b, bar) // unmarshal to bar, which is a *Person
if err != nil {
t.Error(err)
}
testBob(t, bar) // ok
bar = &Person{} // pointer to new, empty struct
err = json.Unmarshal(b, &bar) // wait a minute, passing in a **Person, yet it still works?
if err != nil {
t.Error(err)
}
testBob(t, bar) // ok
}
func testBob(t *testing.T, person *Person) {
if person.Name != "bob" || person.Age != 23 {
t.Error("not equal")
}
}
我真的很惊讶的是,第二个(解组到**Person
)工作。
这是怎么回事json.Unmarshal()
?是否解除引用指针,直到它找到一个结构?
的文档提供:
来解组JSON为指针,解组首先处理的 的情况下,JSON作为JSON字面空。在这种情况下,Unmarshal将 指向nil。否则,解组解编的JSON到 值在由指针
这似乎是做了一些比这更尖。到底发生了什么?
充实了我的问题更:它是如何知道自动取消引用我的指针的指针?该文件表示,它将解组“指针指向的价值”。由于我的指针的值实际上是另一个指针,并且没有名称/年龄字段,所以我期望它停在那里。
要清楚:我并不是说在Unmarshal()
中存在错误或错误;我试图满足我的惊讶,即在给定ptr-ptr时,它一切正常,并避免使用它的任何潜在缺陷。
解码器必须遵循指针,并根据需要分配内部指针。这样做的结果是会遵循多级指针。除了你已经提供的答案之外,问题究竟是什么? – JimB
我试着去补充一点。 –
:)它[不停]](https://play.golang.org/p/YJPAvmMwqW)在一个级别额外 – RickyA