我想将 JSON 文件解析为 map[string]interface{}
:
var migrations map[string]interface{}
json.Unmarshal(raw, &migrations)
fmt.Println(migrations["create_user"])
但我修改了我的代码以将数据指向接口(interface){}
:
var migrations interface{}
json.Unmarshal(raw, &migrations)
// compile wrong here
fmt.Println(migrations["create_user"])
在上述情况下,我不太了解 map[string]interface{}
和 interface{}
之间的区别。
最佳答案
这两种类型之间的区别就像它看起来的一样:
interface{}
是“任何”类型,因为所有 类型都实现没有功能的接口(interface)。map[string]interface{}
是一个映射,其键是字符串,值是任何类型。
将字节数组从 JSON 解码到内存时,使用 interface{}
类型最简单,因为它可以存储任何类型的 JSON 文档(对象、数组、基元等);然而,它可能需要更多的反射来处理底层数据。当您知道 JSON 文档是一个对象时,使用 map[string]interface{}
很常见,而当您知道文档是一个数组时,使用 []interface{}
很常见.
但是,解码 JSON 的最佳方法(尤其是当您提前知道文档的结构时)是定义和使用准确描述数据的自定义结构类型。这样您就可以避免任何反射并提高代码的易读性。
关于go - map[string]interface{} 和 interface{} 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48988823/