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

8 回复

你的代码中使用 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{} 却不行,
我现在理解为前两者是“类型”,后者是“类型数组”所以不行,这样对不?

我又试了自定义类型
<br>type Evt struct {<br> Year int `json:"year"`<br> Title string `json:"title"`<br>}<br>
编译无错但运行报错:
<br>jstr := `[{"01":[{"year":1662,"title":"ggg"},{"year":1835,"title":"uuuu"}]}]`<br>var data3 []map[string]interface{}<br>_ = json.Unmarshal([]byte(jstr), &amp;data3)<br><br>title3 := data3[0]["01"].([]interface{})[0].(Evt).Title<br>fmt.Println(title3)<br>
这又是怎么回事,是否不能用结构体类型?求教。

你不用先断言吗


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语言中非常强大和灵活,常被用作通用类型,尤其是在处理不同类型的数据时。

主要用途

  1. 函数参数和返回值:使用 interface{} 可以让函数接受或返回任何类型的数据。这在编写需要处理多种数据类型的函数时特别有用。

  2. 类型断言和类型选择:虽然 interface{} 提供了灵活性,但在处理具体数据时,通常需要通过类型断言(type assertion)或类型选择(type switch)来恢复其原始类型。

  3. JSON解码:在处理JSON数据时,解码器通常会将数据解码为 map[string]interface{}[]interface{},这允许灵活地处理嵌套和不同类型的JSON结构。

注意事项

  • 使用 interface{} 可能会增加运行时开销,因为涉及到类型检查和可能的类型转换。
  • 过度使用 interface{} 可能会使代码难以理解和维护,因为它隐藏了数据的具体类型。
  • 在性能敏感的场景中,应谨慎使用 interface{},并考虑是否有更具体的类型可以替代。

总之,interface{} 是Go语言中一个非常有用的特性,它提供了极大的灵活性,但也需要谨慎使用,以避免引入不必要的复杂性和性能开销。

回到顶部