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

怎么建设网站视频教程爱站网官网关键词

怎么建设网站视频教程,爱站网官网关键词,网站功能说明书,wordpress模板开发文档reflect.DeepEqual(x, y)函数 功能是比较x和y是否一致,x和y不仅限于基础类型,也可以是像array、 slice、 map、 ptr、struct、interface类型,在代码中经常能见到。 一起看下是怎么实现的吧~ func DeepEqual(x, y interface{}) bool {if x …

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一下

http://www.hrbkazy.com/news/56405.html

相关文章:

  • 赌博网站怎么做的百度快速收录软件
  • 前端做一个网站需要些什么软件爱站seo工具包官网
  • 武汉网站建设dw027seo优化宣传
  • 桂林网站建设公司查找网站
  • php做网站怎么样windows优化大师和鲁大师
  • 南京医疗网站建设优化关键词排名seo
  • 网站建设与网页设计实验报告石家庄网站关键词推广
  • 让人做网站需要注意什网站开发详细流程
  • 在网站做的pdf有水印如何删除简单网站建设优化推广
  • 做网站买流量自媒体代运营
  • 如何建开发手机网站首页合肥seo排名优化
  • wordpress批量修改文章标题长沙关键词优化平台
  • 如何选择网站公司搜索引擎优化结果
  • 企业百度网站怎么做的免费建一级域名网站
  • 网站界面设计psseo云优化
  • 河北网站制作 网站开发四种基本营销模式
  • 公司手机网站开发招标书免费b2b平台推广
  • 阿里巴巴的网站应该怎么做石家庄网站建设就找
  • wordpress+4.5+多站点西安seo技术
  • 2023年企业年报入口网站网页的优化方法
  • 简单的公司资料网站怎么做惠州seo优化
  • 拓者设计吧会员有啥区别宁波seo网络推广产品服务
  • 博客网站开发视频广告网络推广怎么做
  • 专业长春网站建设网百度的网页地址
  • 内乡微网站开发中小企业网络营销现状
  • 机械加工类网站怎么做上海网络推广招聘
  • dedecms招聘网站优化课程设置
  • 手机网站 生成app智能建站网站模板
  • 沈阳做网站费用对网络营销的理解
  • 衡水做网站服务商精准引流怎么推广