go sync.Map包装过的对象nil值的判断

被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

断点截图:
go sync.Map包装过的对象nil值的判断_第1张图片
map load的源码:
go sync.Map包装过的对象nil值的判断_第2张图片

maptest.Store(“a”, test)设置进去的是*interface{},但是取出来的其实是interface{}|interface{},说明被包装了一层,相当于返回一个对象,对象内容是interface{},所以不能直接和nil做比较。

你可能感兴趣的:(golang)