go - map[string]interface{} 和 interface{} 的区别

标签 go interface go-map

我想将 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{} 之间的区别。

最佳答案

这两种类型之间的区别就像它看起来的一样:

  1. interface{} 是“任何”类型,因为所有 类型都实现没有功能的接口(interface)。

  2. map[string]interface{} 是一个映射,其键是字符串,值是任何类型。

将字节数组从 JSON 解码到内存时,使用 interface{} 类型最简单,因为它可以存储任何类型的 JSON 文档(对象、数组、基元等);然而,它可能需要更多的反射来处理底层数据。当您知道 JSON 文档是一个对象时,使用 map[string]interface{} 很常见,而当您知道文档是一个数组时,使用 []interface{} 很常见.

但是,解码 JSON 的最佳方法(尤其是当您提前知道文档的结构时)是定义和使用准确描述数据的自定义结构类型。这样您就可以避免任何反射并提高代码的易读性。

关于go - map[string]interface{} 和 interface{} 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48988823/

相关文章:

java - java中如何区分接口(interface)和类

c# - 有没有办法强制派生类实现抽象类或嵌套在基类中的接口(interface)?

arrays - 如何在 golang 中编写具有嵌套递归数据的结构

go - 如何处理必需和可选的命令行参数?

go - 使用反射使所有属性小写或大写?

firebase - 当路径中的数据不存在时如何使用 Go Firebase-Admin SDK 检测空结果

c# - 如何序列化 IList<T> 等接口(interface)

dictionary - 如何检查 map 是否包含 Go 中的键?

go - goroutine语句执行和函数执行的不同行为