Golang Go语言中请教下 interface{} 的问题
jstr := `{"01":[{"year":1662,"title":"ggg"},{"year":1835,"title":"uuuu"}]}`
var data map[string]interface{}
//data := map[string]interface{}{}
//上面两种定义都可以,第二种要怎么理解,为什么要加{}?
_ = json.Unmarshal([]byte(jstr), &data)
//title := data[“01”].([]map[string]interface{})[0][“title”] //不行
title := data[“01”].([]interface{})[0].(map[string]interface{})[“title”]
//为什么上面的方式不行,下面的行?
fmt.Println(title.(string))
Golang Go语言中请教下 interface{} 的问题
更多关于Golang Go语言中请教下 interface{} 的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码中使用 var 关键字声明的 data 没有初始化,:=声明的变量是已经初始化的,{}表示没有任何键值对
第二个问题因为你的 json 结构决定的,01 这个 key ,对应的 value 的最顶层是个[]
更多关于Golang Go语言中请教下 interface{} 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
上面只有类型,下面有初始化
****************************
{} -> 键值对,[] -> 数组
因为 Go 不是 Java
[]interface{} 不是 []map[string]interface{}
panic 报错信息已经说的很清楚了
我的疑问是为什么 []interface{} 和 map[string]interface{} 可以,[]map[string]interface{} 却不行,
我现在理解为前两者是“类型”,后者是“类型数组”所以不行,这样对不?
你不用先断言吗
var s any = []any{1}
fmt.Println(s.([]int))
s 指向的是 []any ,不能强制转换为 []int
var m any
_ = json.Unmarshal([]byte({"k":"v"}
), &m)
fmt.Println(m)
m 是 map ,不能强制转换为结构体
在Go语言中,interface{}
是一个空接口,它表示没有任何方法的接口。由于它不包含任何方法签名,因此任何类型都隐式地实现了空接口。这使得 interface{}
在Go语言中非常强大和灵活,常被用作通用类型,尤其是在处理不同类型的数据时。
主要用途
-
函数参数和返回值:使用
interface{}
可以让函数接受或返回任何类型的数据。这在编写需要处理多种数据类型的函数时特别有用。 -
类型断言和类型选择:虽然
interface{}
提供了灵活性,但在处理具体数据时,通常需要通过类型断言(type assertion
)或类型选择(type switch
)来恢复其原始类型。 -
JSON解码:在处理JSON数据时,解码器通常会将数据解码为
map[string]interface{}
或[]interface{}
,这允许灵活地处理嵌套和不同类型的JSON结构。
注意事项
- 使用
interface{}
可能会增加运行时开销,因为涉及到类型检查和可能的类型转换。 - 过度使用
interface{}
可能会使代码难以理解和维护,因为它隐藏了数据的具体类型。 - 在性能敏感的场景中,应谨慎使用
interface{}
,并考虑是否有更具体的类型可以替代。
总之,interface{}
是Go语言中一个非常有用的特性,它提供了极大的灵活性,但也需要谨慎使用,以避免引入不必要的复杂性和性能开销。