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{}))
然后,没断言前打印出的括号的第二个就是你打印的第一个值