vit*_*ter 4 json pointers interface go unmarshalling

interface{}json.Unmarshal

因为一段代码值一千字,所以举个例子:

package main

import (
    "encoding/json"
    "fmt"
)

func test(i interface{}) {
    j := []byte(`{ "foo": "bar" }`)
    fmt.Printf("%T\n", i)
    fmt.Printf("%T\n", &i)
    json.Unmarshal(j, &i)
    fmt.Printf("%T\n", i)
}

type Test struct {
    Foo string
}

func main() {
    test(Test{})
}

哪些输出:

main.Test
*interface {}
map[string]interface {}
json.Unmarshalmap[string]interface{}
interface{}*interface{}json.Unmarshalmap[string]interface{}
Unmarshal

要将 JSON 解组为接口值,Unmarshal 将其中之一存储在接口值中:[...]

如果我像这样传递一个指向测试函数的指针,它会起作用:

func test(i interface{}) {
    j := []byte(`{ "foo": "bar" }`)
    fmt.Printf("%T\n", i)
    fmt.Printf("%T\n", &i)
    json.Unmarshal(j, i)
    fmt.Printf("%T\n", i)
    fmt.Println(i)
}

func main() {
    test(&Test{})
}

哪些输出:

*main.Test
*interface {}
*main.Test
&{bar}
&Unmarshal*Testi
&iUnmarshali

如果我运行:

func test(i interface{}) {
    j := []byte(`{ "foo": "bar" }`)
    fmt.Printf("%T\n", i)
    fmt.Printf("%T\n", &i)
    json.Unmarshal(j, &i)
    fmt.Printf("%T\n", i)
    fmt.Println(i)
}

func main() {
    test(&Test{})
}

那么它仍然有效:

*main.Test
*interface {}
*main.Test
&{bar}

现在我没有谷歌搜索查询了。