问题描述
在序列化/反序列化带有JSON的结构时,我可能做错了。在JSON反序列化后声明接口时:
AData2 = anInterface.(Data)
在运行时,go需要一个map [string]接口,但是该对象的类型为Data:
type Data struct {
Content string
Links []string
}
它引发错误:
panic:接口转换:interface {}是map [string] interface {}, 不是main.Data
位于https://play.golang.org/p/jm3_ut3R56n的完整代码
在此先感谢您的提示。
解决方法
您不能只是将任何interface
声明为随机struct
类型或类似内容。
如果该interface
实际上是该struct
类型的数据,则只有您可以断言该interface
类型的数据为struct
。
type Data struct {
Content string
Links []string
}
func main() {
var AData,AData2 Data
var anInterface interface{}
// populate data
AData.Content = "hello world"
AData.Links = []string{"link1","link2","link3"}
anInterface = AData
AData2 = anInterface.(Data)
}
您看到anInterface
已经是Data
类型的值,这就是为什么我们可以再次将其声明为Data
类型。
另一件事,如果您实际上想将json
数据反序列化为Data
类型的结构,则应该直接unmarshal
到该变量中。
var AData2 Data
err = json.Unmarshal([]byte(value),&AData2)
if err != nil {
panic(err)
}