怎么用go语言比较两个对象是否深度相同


这篇文章主要介绍“怎么用go语言比较两个对象是否深度相同”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用go语言比较两个对象是否深度相同”文章能帮助大家解决问题。前言:DeepEqual函数的参数是两个interface,实际上也就是可以输入任意类型,输出 true 或者 flase 表示输入的两个变量是否是“深度”相等。先明白一点,如果是不同的类型,即使是底层类型相同,相应的值也相同,那么两者也不是“深度”相等。上面的代码中,m, y 底层都是 int,而且值都是 1,但是两者静态类型不同,前者是MyInt,后者是YourInt,因此两者不是“深度”相等。在源码里,有对 DeepEqual 函数的非常清楚地注释,列举了不同类型,DeepEqual 的比较情形,这里做一个总结:一般情况下,DeepEqual 的实现只需要递归地调用 == 就可以比较两个变量是否是真的“深度”相等。但是,有一些异常情况:比如 func 类型是不可比较的类型,只有在两个 func 类型都是 nil 的情况下,才是“深度”相等;float 类型,由于精度的原因,也是不能使用 == 比较的;包含 func 类型或者 float 类型的 struct, interface, array 等。对于指针而言,当两个值相等的指针就是“深度”相等,因为两者指向的内容是相等的,即使两者指向的是 func 类型或者 float 类型,这种情况下不关心指针所指向的免费云主机域名内容。同样,对于指向相同 slice, map 的两个变量也是“深度”相等的,不关心 slice, map 具体的内容。对于“有环”的类型,比如循环链表,比较两者是否“深度”相等的过程中,需要对已比较的内容作一个标记,一旦发现两个指针之前比较过,立即停止比较,并判定二者是深度相等的。这样做的原因是,及时停止比较,避免陷入无限循环。来看源码:首先查看两者是否有一个是 nil 的情况,这种情况下,只有两者都是 nil,函数才会返回 true接着,使用反射,获取x,y 的反射对象,并且立即比较两者的类型,根据前面的内容,这里实际上是动态类型,如果类型不同,直接返回 false。最后,最核心的内容在子函数deepValueEqual中。代码比较长,思路却比较简单清晰:核心是一个 switch 语句,识别输入参数的不同类型,分别递归调用 deepValueEqual 函数,一直递归到最基本的数据类型,比较 int,string 等可以直接得出 true 或者 false,再一层层地返回,最终得到“深度”相等的比较结果。实际上,各种类型的比较套路比较相似,这里就直接节选一个稍微复杂一点的map类型的比较:和前文总结的表格里,比较 map 是否相等的思路比较一致,也不需要多说什么。说明一点,visited是一个 map,记录递归过程中,比较过的“对”:比较过程中,一旦发现比较的“对”,已经在 map 里出现过的话,直接判定“深度”比较结果的是true。关于“怎么用go语言比较两个对象是否深度相同”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注百云主机行业资讯频道,小编每天都会为大家更新不同的知识点。

相关推荐: Go语言中的IO操作及Flag包使用实例分析

这篇文章主要介绍了Go语言中的IO操作及Flag包使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中的IO操作及Flag包使用实例分析文章都会有所收获,下面我们一起来看看吧。fmt.Scanf 空格作为分隔符,占…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/06 18:02
下一篇 05/06 18:02

相关推荐