map[string]interface{}中value的空值特性

1. 运行环境

go version go1.18.4 darwin/arm64

2. 问题描述?

var value1 map[string]interface{}
m := map[string]interface{}{
    "key1": value1,
}
println(value1)
println(m["key1"])
println(m["key1"] == nil)
println(m["key2"] == nil)

输出

0x0
(0x102c1a5c0,0x0)
false
true

为什么空值value放进map再取出来,其值就变了?

3. 您期望得到的结果?

0x0
0x0
true
true

4. 您实际得到的结果?

0x0
(0x102c1a5c0,0x0)
false
true

5. 答案及解释

经过进一步了解:

  • go允许为空的几个类型,每个类型的nil值都是不一样的
  • interface也是一种类型,其组成为type+value,只有当type和value都为空时才是nil值
  • map类型的空值直接就是nil值。

所以

  • value1一直会是nil
  • 当value1放入m后,因为m的value是interface类型,放进去时将type设置为了map[string]interface{},value设置为了nil,再取出时,得到的是一个(type=map[string]interface{},value=nil)的interface值,和interface的nil值(type=nil, value=nil)并不相等。

解决方式:如第一个回答@deatil 所说,加上断言后,就变为了map的nil值,就能够解决判断问题。

最佳答案

需要断言
println(m["key1"].(map[string]interface{}))
然后,没断言前打印出的括号的第二个就是你打印的第一个值

1年前 评论
讨论数量: 4

需要断言
println(m["key1"].(map[string]interface{}))
然后,没断言前打印出的括号的第二个就是你打印的第一个值

1年前 评论

第二句明显是有值的,所以不会是0x0

1年前 评论

你需要理解 nil 和存储内容是 nil 的 interface{}

1年前 评论
DianWang

一般不直接相等,试试这么写: v, ok := m["key1"] 通过ok来判断

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!