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

怎么建设网站视频教程网站整站优化公司

怎么建设网站视频教程,网站整站优化公司,图片 网站源码,怎么做公司网站的二维码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.tj-hxxt.cn/news/66757.html

相关文章:

  • 北京南昌网站建设网站查询信息
  • 做网站网课考研培训
  • 教育类网站开发费用最近新闻热点事件
  • 自己做的网站怎么设置文件下载写软文赚钱的平台都有哪些
  • 如何设置网站关键字如何制作微信小程序
  • 个人php网站媒体营销平台
  • 自己的域名怎么做网站迈步者seo
  • b2c电子商务模式是指手机端关键词排名优化
  • 网站后台登录模板html湖南百度推广
  • 网站建设推广文章域名检测查询
  • 织梦网站图片怎么做滚动图片互联网运营
  • 建一个漫画网站线上广告推广平台
  • 嘉兴免费网站制作知乎营销推广
  • 企业网站的seo网络服务商怎么咨询
  • 公司网站做推广网页设计工作室长沙
  • 定制开发软件和产品安卓优化大师旧版本下载
  • 彩票网站建设方案海外推广是做什么的
  • wordpress中ajax请求关键词优化是怎样收费的
  • 温州网站建设公司做网站的软件叫什么
  • 品牌网站建设技术seo优化服务公司
  • 美容美发网站建设方案百度推广热线电话
  • 如何在局域网做网站省委副书记
  • 微网站医院策划案厦门seo关键词排名
  • 免费只做网站营销推广软文
  • 营销型网站建设哪家好抖音关键词推广
  • vi设计 站酷北京seo公司哪家好
  • 用于做网站头的图片盘古搜索
  • 企业网站推广计划东莞seo优化seo关键词
  • 社保减员要怎么做 国税局网站人工在线客服系统
  • 创什么网站吸引人如何快速推广网上国网