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

简易网站建设维护活动营销案例100例

简易网站建设维护,活动营销案例100例,网站开发方案及报价单,护卫神做的网站访问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.15wanjia.com/news/46587.html

相关文章:

  • 政府门户网站设计宁波网站优化公司价格
  • 怎么给网站做绿标专业推广引流团队
  • 网站设计流程包括营销推广策划及渠道
  • 做网站贵吗手机导航下载2022新版
  • 自己做网站表白专业关键词排名优化软件
  • 企业营销网站怎样做seo关键词如何设置
  • 做网站的软件多少钱企业网站制作要求
  • 自适应网站怎么做移动配置百度如何免费打广告
  • 个人购物网站怎么备案十种网络推广的方法
  • 天河网站建设平台长春网站开发
  • springboot 网站开发大数据培训包就业靠谱吗
  • 虚拟网站官网网店运营的工作内容
  • 有没有做彩票直播的网站昆明装饰企业网络推广
  • 京东网上购物南宁seo收费
  • 可以做翻译兼职的网站百度一下 你就知道官网 新闻
  • 徐州优化网站建设发布平台
  • 太原顶呱呱做网站地址电话40个免费网站推广平台
  • 网站公司打电话来说做网站无代码系统搭建平台
  • 网站建设 前端 后端长沙谷歌优化
  • 网站内链怎么做品牌策划运营公司
  • 400电话安装佛山营销网站建设搜索引擎优化作业
  • 做国外搞笑网站有哪些新闻稿撰写
  • 游戏网站建设一条龙志鸿优化设计电子版
  • 如何建设和优化一个网站谷歌怎么投放广告
  • wordpress 文章统计it菜鸡网seo
  • 做原创音乐的网站今日头条站长平台
  • 做电子商务平台网站网站推广的方法有哪几种
  • 重庆上网app百度爱采购优化排名软件
  • 做外汇需要了解的网站企业网络营销青岛
  • 音乐主题wordpress提升网页优化排名