Go中的JSON解码会改变对象类型吗?

Go中的JSON解码会改变对象类型吗?,json,go,Json,Go,我试图构建一个库,它可以从JSON文件中读取多种不同类型的对象(实际的库从couchdb中提取它们,但出于这个目的,它是从JSON中加载它们) 我的库不知道加载的对象的具体类型,因此下面的“CreateObject()”调用(由实际代码中的接口实现) 我遇到一个问题,当我试图将CreateObject()调用创建的对象强制转换回我的具体类型(示例中为MyType)时,我会感到恐慌: panic: interface conversion: interface is map[string]inte

我试图构建一个库,它可以从JSON文件中读取多种不同类型的对象(实际的库从couchdb中提取它们,但出于这个目的,它是从JSON中加载它们)

我的库不知道加载的对象的具体类型,因此下面的“CreateObject()”调用(由实际代码中的接口实现)

我遇到一个问题,当我试图将CreateObject()调用创建的对象强制转换回我的具体类型(示例中为MyType)时,我会感到恐慌:

panic: interface conversion: interface is map[string]interface {}, not main.MyType
我想知道我在这里哪里出了问题,或者是否有另一种更像我应该用的方式来解决这个问题。如果我用Java做的话,我会使用泛型,并且希望它是简单明了的

请注意,如果我注释掉json.NewDecoder。。。行,然后代码工作(按预期打印出一个空行)。这意味着解码操作中发生了一些事情

可运行的示例如下:

package main

import (
    "encoding/json"
    "fmt"
    "strings"
)

type MyType struct {
    Name string `json:"name"`
    Age  int32  `json:"age"`
}

func CreateObject() interface{} {
    return MyType{}
}

func LoadJsonData() interface{} {
    obj := CreateObject()
    jsonStr := `{"name":"Person", "age":30}`
    json.NewDecoder(strings.NewReader(jsonStr)).Decode(&obj)

    return obj
}

func main() {

    obj := LoadJsonData()

    // This works for some reason
    // y := obj.(map[string]interface{})
    // fmt.Println(y["name"])

    // This causes a panic
    x := obj.(MyType)
    fmt.Println(x.Name)
}

您应该使用指针而不是结构:

func CreateObject() interface{} {
    return &MyType{} // here
}

...

// This causes a panic
x := obj.(*MyType) // and there
fmt.Println(x.Name)
享受:

如果您想了解更多关于它的内容,请考虑下面的线程: