当前位置: 首页 > news >正文

【golang】【源代码】reflect.DeepEqual(x,y)函数

reflect.DeepEqual(x, y)函数

功能是比较x和y是否一致,x和y不仅限于基础类型,也可以是像array、 slice、 map、 ptr、struct、interface类型,在代码中经常能见到。
一起看下是怎么实现的吧~

func DeepEqual(x, y interface{}) bool {if x == nil || y == nil {return x == y}v1 := ValueOf(x)v2 := ValueOf(y)if v1.Type() != v2.Type() {return false}return deepValueEqual(v1, v2, make(map[visit]bool), 0)
}
  1. 先判断x和y是否为空,一方为空,另一方不为空则肯定不相等;两者都为空那就相等。
  2. 判断类型是否一致,如果x和y类型都不一致,那肯定不相等。

继续比较,

func deepValueEqual(v1, v2 Value, visited map[visit]bool, depth int) bool {if !v1.IsValid() || !v2.IsValid() {return v1.IsValid() == v2.IsValid()}if v1.Type() != v2.Type() {return false}// if depth > 10 { panic("deepValueEqual") }	// for debugging// We want to avoid putting more in the visited map than we need to.// For any possible reference cycle that might be encountered,// hard(t) needs to return true for at least one of the types in the cycle.hard := func(k Kind) bool {switch k {case Map, Slice, Ptr, Interface:return true}return false}if v1.CanAddr() && v2.CanAddr() && hard(v1.Kind()) {addr1 := unsafe.Pointer(v1.UnsafeAddr())addr2 := unsafe.Pointer(v2.UnsafeAddr())if uintptr(addr1) > uintptr(addr2) {// Canonicalize order to reduce number of entries in visited.// Assumes non-moving garbage collector.addr1, addr2 = addr2, addr1}// Short circuit if references are already seen.typ := v1.Type()v := visit{addr1, addr2, typ}if visited[v] {return true}// Remember for later.visited[v] = true}switch v1.Kind() {case Array:for i := 0; i < v1.Len(); i++ {if !deepValueEqual(v1.Index(i), v2.Index(i), visited, depth+1) {return false}}return truecase Slice:if v1.IsNil() != v2.IsNil() {return false}if v1.Len() != v2.Len() {return false}if v1.Pointer() == v2.Pointer() {return true}for i := 0; i < v1.Len(); i++ {if !deepValueEqual(v1.Index(i), v2.Index(i), visited, depth+1) {return false}}return truecase Interface:if v1.IsNil() || v2.IsNil() {return v1.IsNil() == v2.IsNil()}return deepValueEqual(v1.Elem(), v2.Elem(), visited, depth+1)case Ptr:if v1.Pointer() == v2.Pointer() {return true}return deepValueEqual(v1.Elem(), v2.Elem(), visited, depth+1)case Struct:for i, n := 0, v1.NumField(); i < n; i++ {if !deepValueEqual(v1.Field(i), v2.Field(i), visited, depth+1) {return false}}return truecase Map:if v1.IsNil() != v2.IsNil() {return false}if v1.Len() != v2.Len() {return false}if v1.Pointer() == v2.Pointer() {return true}for _, k := range v1.MapKeys() {val1 := v1.MapIndex(k)val2 := v2.MapIndex(k)if !val1.IsValid() || !val2.IsValid() || !deepValueEqual(val1, val2, visited, depth+1) {return false}}return truecase Func:if v1.IsNil() && v2.IsNil() {return true}// Can't do better than this:return falsedefault:// Normal equality sufficesreturn valueInterface(v1, false) == valueInterface(v2, false)}
}
  1. 如果是slice map ptr interface 类型,hard 返回true; 如果是array 原始元素类型hard返回false。
  2. 拿slice类型举个例子,会先判断x和y是否为空,会判断x和y的长度是否一致,判断是否指向同一指针,然后递归比较各个元素。
  3. 注意&Person{name1,age1} 是ptr类型,Person{name1,age1}是struct类型。
  4. 注意如果是func类型,如果两个func都会nil时认为x和y一致,否则被判定为不一致。

大家可以用各种例子试一试,debug一下

相关文章:

【golang】【源代码】reflect.DeepEqual(x,y)函数

reflect.DeepEqual(x, y)函数 功能是比较x和y是否一致&#xff0c;x和y不仅限于基础类型&#xff0c;也可以是像array、 slice、 map、 ptr、struct、interface类型&#xff0c;在代码中经常能见到。 一起看下是怎么实现的吧~ func DeepEqual(x, y interface{}) bool {if x …...

Python实现定时执行脚本(4)

前言 本文是该专栏的第16篇,后面会持续分享python的各种干货知识,值得关注。 在项目开发中,难免会需要用到定时任务。比如说,在某个时间段,甚至是达到某时某分某秒自动运行你部署好的功能脚本。而在本专栏的前面,笔者有详细介绍过3种使用python执行定时脚本的方法。 1.…...

量子力学(4) 全同粒子

如果势能与时间无关&#xff0c;那么Ψψe−iEt/ℏ\Psi\psi e^{-iEt/\hbar}Ψψe−iEt/ℏ&#xff0c;EEE是系统的总能量。 全同粒子分为玻色子和费米子。所有电子是全同的费米子。所有质子是全同的费米子。全同就是说不可能区分出其中的一个&#xff0c;比如说你摇了五个骰子…...

13、Swin Transformer: Hierarchical Vision Transformer using Shifted Windows

简介 主页&#xff1a;https://github. com/microsoft/Swin-Transformer. Swin Transformer 是 2021 ICCV最佳论文&#xff0c;屠榜了各大CV任务&#xff0c;性能优于DeiT、ViT和EfficientNet等主干网络&#xff0c;已经替代经典的CNN架构&#xff0c;成为了计算机视觉领域通用…...

C++基础入门丨8. 结构体——还需要知道这些

Author&#xff1a;AXYZdong 硕士在读 工科男 有一点思考&#xff0c;有一点想法&#xff0c;有一点理性&#xff01; 定个小小目标&#xff0c;努力成为习惯&#xff01;在最美的年华遇见更好的自己&#xff01; CSDNAXYZdong&#xff0c;CSDN首发&#xff0c;AXYZdong原创 唯…...

算法第十六期——动态规划(DP)之线性DP

【概述】 线性动态规划&#xff0c;是较常见的一类动态规划问题&#xff0c;其是在线性结构上进行状态转移&#xff0c;这类问题不像背包问题、区间DP等有固定的模板。 线性动态规划的目标函数为特定变量的线性函数&#xff0c;约束是这些变量的线性不等式或等式&#xff0c;目…...

智慧新零售网络解决方案,助力新零售企业数智化转型

随着数字化时代的不断发展&#xff0c;新零售连锁业务模式“线上线下”融合发展&#xff0c;数据、设备在逐渐增加&#xff0c;门店数量也会随着企业规模的扩大而增加&#xff0c;但由于传统网络架构不稳定、延时、容量小影响服务质量&#xff08;QoS&#xff09;、分支设备数量…...

Go语言规范中的可赋值

了解可赋值规范的重要性当使用type关键字定义类型的时候&#xff0c;会遇到一些问题&#xff0c;如下&#xff1a;func main(){var i int 2pushInt(i) } type MyInt int //基于int定义MyInt func pushInt(i MyInt){}结果&#xff1a;调用函数pushInt报错 cannot use i (variab…...

外盘国际期货招商:原油市场热点话题

原油市场热点话题 问&#xff1a;目前美国原油库存如何&#xff1f; 答&#xff1a;EIA原油库存数据显示&#xff0c;由于美国炼油厂季节性检修&#xff0c;开工率继续下降&#xff0c;原油库存连续九周增长至2021年5月份以来最高水平&#xff0c;同期美国汽油库存减少而精炼…...

[蓝桥杯 2018 省 A] 付账问题 贪心题

几个人一起出去吃饭是常有的事。但在结帐的时候&#xff0c;常常会出现一些争执。现在有 n 个人出去吃饭&#xff0c;他们总共消费了 S 元。其中第 i 个人带了 ai 元。幸运的是&#xff0c;所有人带的钱的总数是足够付账的&#xff0c;但现在问题来了&#xff1a;每个人分别要出…...

微机原理复习(周五),计算机组成原理图

1.计算机由运算器&#xff0c;控制器&#xff0c;存储器&#xff0c;输入设备&#xff0c;输出设备等5大基本部件组成。 2.冯诺依曼提出存储设计思想是&#xff1a;数字计算机的数制采用二进制&#xff0c;存储程序&#xff0c;程序控制。 3.计算机的基本组成框图&#xff1a…...

用了10年Postman,意想不到它的Mock功能也如此强大

最近在做一些app&#xff0c;前后端分离的开发模式是必须的。一直用的python flask做后端的快速POC&#xff0c;python本身就是一门胶水语言&#xff0c;开发起来方便快捷&#xff0c;而flask又是一个极简的webserver框架&#xff08;比Django简洁&#xff09;。但在这里推荐的…...

项目重构,从零开始搭建一套新的后台管理系统

背景 应公司发展需求&#xff0c;我决定重构公司的后台管理系统&#xff0c;从提出需求建议到现在的实施&#xff0c;期间花了将近半个月的时间&#xff0c;决定把这些都记录下来。 之前的后台管理系统实在是为了实现功能而实现的&#xff0c;没有考虑到后期的扩展性&#xf…...

day20_Map

今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、比较器排序 三、Collections 四、Map 五、HashMap 六、TreeMap 零、 复习昨日 HashSet 不允许重复元素,无序 HashSet去重原理: 先比较hashco…...

localStorage和sessionStorage

目录 一、localStorage和SessionStorage在哪里&#xff0c;是什么 二、localStorage和sessionStorage区别 三、localStorage常用方法 四、sessionStorage常用方法 一、localStorage和SessionStorage在哪里&#xff0c;是什么 【1】在浏览器开发者工具的Application栏目里&…...

IP地址,子网掩码,网段 概念详解

文章目录1. 子网掩码1.1 子网掩码的概念及作用1.2 子网掩码的组成1.3 子网掩码的表示方法1.4 为什么要使用子网掩码&#xff1f;1.5 子网掩码的分类2. 子网掩码和IP地址的关系2.1 根据掩码确定网段IP地址是以 网络号和 主机号来标示网络上的主机的&#xff0c;我们把网络号相同…...

数影周报:动视暴雪疑似数据泄露,数据出境安全评估申报最新进展

本周看点&#xff1a;动视暴雪疑似员工敏感信息及游戏数据泄露&#xff1b;谷歌云计算部门&#xff1a;两名员工合用一个工位&#xff1b;数据出境安全评估申报最新进展&#xff1b;TikTok Shop东南亚商城在泰国和菲律宾公布&#xff1b;智己汽车获九大金融机构50亿元贷款签约.…...

Web安全最详细学习路线指南,从入门到入职(含书籍、工具包)

在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发 安全研究&#xff1a;二进制方向 安全研究&#xff1a;网络渗透方向 下面逐一说明一下. 第一个方向&#xff1a;安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#x…...

ChatGPT?听说Biying把它下架了

ChatGPT被玩疯了&#xff0c;开始放飞自我 ChatGPT版微软必应上线不到10天…就被网友玩坏了 先说这个词&#xff0c;放飞自我&#xff0c;什么东西才会放飞自我&#xff1f; 人放飞自我&#xff0c;人&#xff1f;你确定是人&#xff1f; 所以让我们来把上面的句子改写一下。…...

中电金信:金融数字化转型路在何方?这里有答案

近期&#xff0c;媒体大数网整合了业内10份研究报告&#xff0c;详解金融数字化转型的思路、方法与路径。其中「中国电子金融级数字底座“源启”白皮书」也被收录其中。让我们一同阅读文章&#xff0c;探究金融数字化转型相关问题的答案吧。 当前&#xff0c;金融科技正在回归…...

3步实现聊天记录永久保存:WeChatExporter全平台导出指南

3步实现聊天记录永久保存&#xff1a;WeChatExporter全平台导出指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而懊悔不已&#xff…...

Python字节码反编译技术深度解析:pycdc项目的架构实现与实战应用

Python字节码反编译技术深度解析&#xff1a;pycdc项目的架构实现与实战应用 【免费下载链接】pycdc C python bytecode disassembler and decompiler 项目地址: https://gitcode.com/GitHub_Trending/py/pycdc 在Python生态系统中&#xff0c;字节码反编译技术一直是系…...

FactoryBluePrints项目深度解析:戴森球计划终极工厂蓝图优化指南

FactoryBluePrints项目深度解析&#xff1a;戴森球计划终极工厂蓝图优化指南 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints项目是戴森球计划游戏中最为…...

Pandoc文档转换工具:从格式混乱到文档自由的工作流革命

Pandoc文档转换工具&#xff1a;从格式混乱到文档自由的工作流革命 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 你是否曾为文档格式转换而烦恼&#xff1f;面对Markdown、Word、PDF、HTML等不同格式的文档…...

KMS智能激活终极指南:5分钟搞定Windows和Office永久激活

KMS智能激活终极指南&#xff1a;5分钟搞定Windows和Office永久激活 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统未激活而烦恼吗&#xff1f;是否经常遇到Office提示"…...

深度解析yuzu模拟器:Switch游戏跨平台运行的技术架构与实战应用

深度解析yuzu模拟器&#xff1a;Switch游戏跨平台运行的技术架构与实战应用 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu yuzu模拟器作为当前最先进的任天堂Switch开源模拟器&#xff0c;实现了在Windows、Linux…...

Navicat Mac版试用期重置终极指南:3种简单方法实现永久免费使用

Navicat Mac版试用期重置终极指南&#xff1a;3种简单方法实现永久免费使用 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 你…...

如何用Python快速接入Taotoken调用多模型API完成开发任务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 如何用Python快速接入Taotoken调用多模型API完成开发任务 对于开发者而言&#xff0c;快速验证想法、构建原型是开发流程中的关键环…...

[模型解析] GPT: 模型演进分析从GPT-3到GPT-5.5

GPT 模型演进分析&#xff1a;从 GPT-3 到 GPT-5.5 OpenAI 的 GPT 系列模型在过去几年经历了快速演进&#xff0c;从 2020 年的 GPT-3 到 2026 年的 GPT-5.5&#xff0c;每一次迭代都带来了显著的能力提升和架构创新。本文将系统分析 GPT 模型的演进路径与技术特点。 一、GPT 模…...

Topit 技术深度:macOS窗口层级管理的现代SwiftUI实现与架构解析

Topit 技术深度&#xff1a;macOS窗口层级管理的现代SwiftUI实现与架构解析 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 深夜两点&#xff0c;当大多数开发者…...