被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.Mapmaptest.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做比较。