我很偶然地注意到,我可以成功地将指向结构的指针和指向指向结构的指针传递给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 解组为指针,Unmarshal 首先处理 JSON 为 JSON 文本 null 的情况。在这种情况下,Unmarshal 将指针设置为 nil。否则,Unmarshal 将 JSON 解组为指针指向的值
它似乎做得更多。到底是怎么回事?
更多地充实我的问题:它如何知道自动取消对我的指针的引用?文档说它将解组“到指针指向的值中”。由于我的指针的值实际上是另一个指针,并且没有 Name/Age 字段,因此我希望它停在那里。
需要明确的是:我并不是说 ; 中存在错误或错误功能Unmarshal()。我试图满足我的惊讶,即在给定 ptr-to-ptr 时它仍然有效,并避免在我使用它时出现任何潜在的陷阱。
慕盖茨4494581
繁星淼淼
慕妹3146593
相关分类