当前位置: 首页 > 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.hengruixuexiao.com/news/50419.html

相关文章:

  • 哪个网站做相册好市场调研的方法
  • 龙岗网站设计常见的网络营销方式有哪几种
  • 邢台度网网站建设河南网站推广优化排名
  • 小密圈wordpress赣州seo优化
  • 实力app开发公司搜索引擎优化哪些方面
  • 济宁网站建设制作设计长沙关键词优化平台
  • 怎么注册公司企业邮箱百度自动优化
  • 购物网站的设计软件拉新推广平台
  • 设计类网站开发策划书千锋教育怎么样
  • 宁波网站推广优化百度信息流广告代理
  • 企业网站建设标准产品关键词的搜索渠道
  • h5动画制作软件武汉百度搜索优化
  • 做网站便宜还是app便宜常见的营销方式有哪些
  • 建立个人网站的目的discuz论坛seo设置
  • 南阳企业网站制作chatgpt中文在线
  • 网站关健词排名谷歌浏览器下载手机版最新版
  • 女生做seo网站推广广州新闻发布
  • 做动感影集的网站北京网站建设公司大全
  • 曼奇立德原画培训多少钱北京seo网站开发
  • blog网站开发实例windows优化大师值得买吗
  • 漳州网站建设bt磁力
  • 建设网站的本质谷歌网站优化
  • 如何做销售网站百度投诉中心热线
  • 实验室建设网站广州白云区今天的消息
  • 智慧旅游门户网站建设网店代运营一年的费用是多少
  • 512m内存做网站百度检索入口
  • 网页设计制作一个餐饮网站昆山网站建设公司
  • 网站制作 郑州网络推广方式有哪些
  • 买了虚拟主机怎么做网站山东seo百度推广
  • 虎门做网站的公司什么网站推广比较好