猿问

Golang 以不同的方式创建结构体

伙计们!我是 Go 的初学者。当我学习reflect包时,我有一些疑问,这是代码:


package main


import (

    "encoding/json"

    "fmt"

    "reflect"

)


func checkError(err error) {

    if err != nil {

        panic(err)

    }

}


type Test struct {

    X int

    Y string

}


func main() {

    fmt.Println("hello world!")

    test1()

    test2()

}


func test1() {

    a := Test{}

    fmt.Printf("a: %v %T \n", a, a)

    fmt.Println(a)

    err := json.Unmarshal([]byte(`{"X":1,"Y":"x"}`), &a)

    checkError(err)

    fmt.Printf("a: %v %T \n", a, a)

}


func test2() {

    fmt.Println("===========================")

    m := make(map[string]reflect.Type)

    m["test"] = reflect.TypeOf(Test{})

    a := reflect.New(m["test"]).Elem().Interface()

    fmt.Printf("a: %v %T \n", a, a)

    fmt.Println(a)

    err := json.Unmarshal([]byte(`{"X":1,"Y":"x"}`), &a)

    checkError(err)

    fmt.Printf("a: %v %T \n", a, a)

}

结果:


a: {0 } main.Test 

{0 }

a: {1 x} main.Test 

===========================

a: {0 } main.Test 

{0 }

a: map[X:1 Y:x] map[string]interface {}

为什么这两种方式会产生不同的结果,谁能告诉我为什么,非常感谢。


慕少森
浏览 138回答 1
1回答

子衿沉夜

在test2您传入interface{}包含Test值的地址。当 json 包取消引用该值时,它只会看到一个interface{},因此它会解组为默认类型。您需要的是一个interface{}包含指向Test值的指针。// reflect.New is creating a *Test{} value.// You don't want to dereference that with Elem()a := reflect.New(m["test"]).Interface()// 'a' contains a *Test value. You already have a pointer, and you// don't want the address of the interface value.err := json.Unmarshal([]byte(`{"X":1,"Y":"x"}`), a)
随时随地看视频慕课网APP

相关分类

Go
我要回答