被sync.Map包装过的nil 对象,是不能直接用if xxx == nil的方式来判断的
func testnil() *interface{} {
return nil
}
func main() {
var ptr *interface{}
test := testnil()
//p = &Person{}
fmt.Printf("ptr 的值为 : %v\n", ptr)
fmt.Printf("ptr 的值为 : %#v\n", ptr)
println(ptr == nil)
println(test == nil)
var testany *interface{}
println(test == testany)
var maptest sync.Map
maptest.Store("a", test)
test3, _ := maptest.Load("a")
println(test3 == nil)
println(test == testany)
//s := &Person{
// name: "1",
//}
//
//ss := (*any)(s)
}
结果:
ptr 的值为 : <nil>
ptr 的值为 : (*interface {})(nil)
true
true
true
false
true
断点截图:
map load的源码:
maptest.Store(“a”, test)设置进去的是*interface{},但是取出来的其实是interface{}|interface{},说明被包装了一层,相当于返回一个对象,对象内容是interface{},所以不能直接和nil做比较。