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

断点截图:
在这里插入图片描述
map load的源码:
在这里插入图片描述

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

原文地址:https://blog.csdn.net/wzl1369248650/article/details/133134165

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年09月25日 00:42
快速入门使用spring详细步骤(介绍、导入依赖、第一个简单程序)
下一篇 2023年09月25日 00:42