返回顶部
首页 > 资讯 > 后端开发 > GO >GO比较两个对象是否相同实战案例
  • 320
分享到

GO比较两个对象是否相同实战案例

go 对象go比较对象 2022-12-08 20:12:44 320人浏览 泡泡鱼
摘要

目录前言DeepEqual 案例DeepEqual 原理总结前言 本文主要是来聊一聊关于 Golang 中的深度比较 DeepEqual 因为最近发现身边的小伙伴写 2 个或者多个

前言

本文主要是来聊一聊关于 Golang 中的深度比较 DeepEqual

因为最近发现身边的小伙伴写 2 个或者多个 map 比较的时候,都是自己去实现去比较每一个结构,每一个节点的 key 和 value 是不是都相等,且根据不同的数据结构,都要去实现一遍,没有必要自己造轮子

我们知道,对于布尔类型,整形的,浮点类型,复数,指针,字符串类型的值可以直接使用 == 来进行比较,确认双方是否相等

甚至对于 channel 类型,也是可以使用 == 来进行比较是否相等的

那么对于 golang 中的 切片 slice,数组 array,map,interface{},struct 结构体我们如何去进行比较呢?显然使用 == 是不行的,此处的 m1 和 m2 是 map[string]int

此处你是否可能会想到 c++ 还可以去重载操作符,咱们实现一下对应数据类型的操作符就可以了,妥妥的

你是否还会想到 PHP 中的 === 可以直接去比较数据的值和数据的类型,称为全等比较运算符

那么,看到此处,是否可以猜测 Golang 的做法也是类似的呢?

实际上 golang 去比较两个对象是否相同,也是通过去比较数据的类型,数据的值,数据的长度等等维度来进行确认的

C++ 是需要我们自己编码实现,php 是直接提供 === ,Golang 是给我们在反射包中提供一个 DeepEqual 函数来进行灵活使用

DeepEqual 案例

func DeepEqual(x, y interface{}) bool

很多朋友在不知道 golang 有提供 DeepEqual 功能的时候,比较 2 个 map 可能会这样去实现:

func mapEqual(m1, m2 map[string]int) bool {
   for k, v := range m1 {
      vv, ok := m2[k]
      if !ok {
         return false
      }
      if v != vv {
         return false
      }
   }
   return true
}

当然也没有啥问题,但是如果这个时候需要我们比较两个切片是否相等,两个结构体是否相等,甚至两个 interface{} 是否相等的时候,是不是都要去写对应的工具函数呢?

使用 DeepEqual 比较 map

两个同一类型的 map,使用自己编写的 mapEqual 和 使用 DeepEqual 我们得到的结果都是我们所期望的

但是对于 DeepEqual 来说,你可以传入任何类型的数据,入参是 2 个 interface{} 类型的数据,响应是 bool

对于 mapEqual 来说,你就只能传入 map[string]int 类型的数据,看到此处,自己造轮子,弊端还是很明显的吧

自然,你也可以去将参数设计成 interface{} 类型的,然后再去进行各种反射处理

可是明明有官方库,何必自己再弄一遍呢,我们不应该是吸收官方的思想和精华,站在巨佬的肩膀上去做更多有意义的事情吗

使用 DeepEqual 比较 map 和 自定义类型

可使用 DeepEqual 的时候,一定要知道他的运作机制和原理

例如下面的案例,我们自定义一个数据类型 myType实际上和 map[string]int 是一样的, 可是我们去将原生的 map[string]int 的 m1 和 myType 类型 m2 进行比较的时候,他们实际上是不相等的

那么,看到这里,实际上 DeepEqual 自然是要比我们自己写的 mapEqual 强太多了,他不仅关注数据的值,还会关注具体数据的类型,根据不同的数据类型,来进行不同的数据校验和比较

DeepEqual 原理

DeepEqual 的代码实现也非常简单,参数中传入 interface{}, 实现上会去确认具体的数据类型,是否为空,如果是一般的的数据类型,那么直接使用 == 进行比较即可

如果是其他的数据类型,那么就会递归的去调用 deepValueEqual 来一层一层的去校验数据和比较

为什么需要递归调用呢?

这个很明显,例如对于一个切片来说,如果里面的元素是简单的字符串,或者整型数字,那么第一层使用 deepValueEqual 去识别和处理切片的类型比较,读取到切片元素的时候就可以直接走 == 来确认是否相等

那么切片中也是可以是其他的任意数据结构的,也可以是自定义的结构体

因此在做这种比较的时候,遍历到切片元素的时候,也要去确认元素是什么类型的,如果是上述提到的非简单类型,那么仍然需要继续一层一层的识别他的类型,和他的值,再进行逐个比较

例如这样去比较这样结构的切片,真的完全有必要递归去一层一层的确认数据类型和数值

type node struct{
   M map[string]int
   In interface{}
   Sli []map[int][chan int]
}

var sli = []Node{...}

在比较的过程中,哪怕有一个环节不是我们所期望的,那么都会直接返回 false,即不相等

那么,仔细看 DeepEqual 的注释,我们可以看到,这里有详细的关于各种数据类型的比较和校验细节,翻译一下仅供大家参考,希望你有机会用到

  • 数组 Array

比较相同索引处的元素是否相等

  • 结构体 struct

比较相应字段,包括导出和不导出(此处表示字段开头是大写还是小写)

  • 函数 Func

只有当函数为 nil 的时候,才会是相等的,其他情况都不相等

  • Interface{}

两者都存在具体的值的时候,那么是相等的

  • Map

都为空的时候是可以是相等的

都不为空的时候,会去比较他们的长度,他们是否有相同的 key 且对应相同的 value ,若都相同,则相等

  • 指针 pointer

可以直接使用 == 进行比较,和 == 效果一致,或者指针指向的值是相等的

  • 切片 slice

都为 nil 的时候,是相等的

不为空的时候,会去比较他们的长度,且指向的底层数组也得有相同的元素,也就是指向底层数组的地址是相同的

  • 对于 other values 其他的数据类型,例如整型,布尔,字符串,通道

直接可以使用 == 来进行比较, DeepEqual源码实现对于这些类型的数据也是直接使用 == 比较的,简单粗暴

总结

本次主要聊了关于

  • 非简单数据类型的比较如何去处理
  • DeepEqual 的使用方式以及注意事项
  • DeepEqual 的原理和其支持的数据类型的判定规则

到此这篇关于GO比较两个对象是否相同的文章就介绍到这了,更多相关GO比较两个对象相同内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: GO比较两个对象是否相同实战案例

本文链接: https://lsjlt.com/news/174369.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • GO比较两个对象是否相同实战案例
    目录前言DeepEqual 案例DeepEqual 原理总结前言 本文主要是来聊一聊关于 Golang 中的深度比较 DeepEqual 因为最近发现身边的小伙伴写 2 个或者多个 ...
    99+
    2022-12-08
    go 对象 go比较对象
  • 如何go语言比较两个对象是否深度相同
    前言: func DeepEqual(x, y interface{}) bool DeepEqual 函数的参数是两个 interface,实际上也就是可...
    99+
    2022-06-07
    GO 对象 go语言
  • 怎么用go语言比较两个对象是否深度相同
    这篇文章主要介绍“怎么用go语言比较两个对象是否深度相同”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用go语言比较两个对象是否深度相同”文章能帮助大家解决问题。前言:func Dee...
    99+
    2023-06-30
  • java如何比较两个对象是否相等
    在Java中,可以使用equals()方法来比较两个对象是否相等。该方法是Object类的一个方法,所有的类都继承自Object类。...
    99+
    2023-10-24
    java
  • Java中2个对象字段值比较是否相同
    1、工具类 package com.shucha.deveiface.biz.utils; import com.shucha.deveiface.biz.model.Co...
    99+
    2024-04-02
  • Java中2个对象字段值怎么比较是否相同
    这篇文章主要介绍了Java中2个对象字段值怎么比较是否相同的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中2个对象字段值怎么比较是否相同文章都会有所收获,下面我们一起来看看吧。工具类package&nb...
    99+
    2023-06-30
  • js如何比较两个单独的数组或对象是否相等
    这篇文章主要介绍js如何比较两个单独的数组或对象是否相等,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!所谓js的中的传值,其实也就是说5种基本数据类型(null,undefind,b...
    99+
    2024-04-02
  • java怎么比较对象是否相等
    在Java中,可以使用以下几种方法来比较对象是否相等: 使用`==`运算符:`==`运算符用于比较两个对象的引用是否相等,即是否...
    99+
    2023-10-28
    java
  • Java比较两个对象中全部属性值是否相等的方法
    例如下述Java类: import java.io.Serializable; import java.util.List; public class Bean_Topolog...
    99+
    2024-04-02
  • 怎么用Java比较两个对象中全部属性值是否相等
    本篇内容介绍了“怎么用Java比较两个对象中全部属性值是否相等”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!例如下述Java类:import...
    99+
    2023-06-20
  • Golang怎么比较两个slice是否相等
    本篇内容介绍了“Golang怎么比较两个slice是否相等”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、为什么在Golang中无法直接使...
    99+
    2023-07-05
  • Golang比较两个slice是否相等的问题
    目录1、为什么在Golang中无法直接使用==来比较两个slice?2、如何实现两个slice的比较呢?2.1 深度比较2.2 使用reflect.DeepEqual函数3、扩展:如...
    99+
    2023-03-22
    Golang比较两个slice相等 Golang比较slice相等
  • php怎么比较两个数组是否相等
    这篇“php怎么比较两个数组是否相等”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php怎么比较两个数组是否相等”文章吧。比...
    99+
    2023-06-30
  • php怎么对比两个数组是否有相同元素
    对比方法:1、利用array_intersect_assoc()函数对比两个数组的键名和键值,语法“array_intersect_assoc($arr1,$arr2)”,会返回一个包含相同元素的交集数组;2、利用“==”运算符判断交集数组...
    99+
    2022-06-14
    php php数组
  • php如何对比两个数组是否有相同元素
    这篇文章主要介绍“php如何对比两个数组是否有相同元素”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php如何对比两个数组是否有相同元素”文章能帮助大家解决问题。对比方法:1、利用array_int...
    99+
    2023-07-02
  • 详解Golang如何比较两个slice是否相等
    目录前言判断两个[]byte是否相等使用reflect判断slice是否相等手写循环遍历比较性能比较总结前言 开发中经常会遇到需要比较两个slice包含的元素是否完全相等的情况,在g...
    99+
    2022-11-21
    Golang比较slice是否相等 Golang比较slice Golang slice
  • 比较两个字符串是否相等的shell代码
    比较两个字符串是否相等的办法是: if [ "$test"x = "test"x ]; then 这里的关键有几点: 1 使用单个等号 2 注意到等号两边各有一个空格:这是unix shell的要求 3 注...
    99+
    2022-06-04
    字符串 两个 代码
  • Java中怎么用bigdecimal比较两个值是否相等
    在Java中,使用BigDecimal比较两个值是否相等可以使用compareTo方法或者equals方法。 使用compareT...
    99+
    2024-03-07
    Java
  • java怎么判断两个对象是否相等
    java中可以使用equals()方法判断两个对象是否相等,equals() 方法用于将字符串与指定的对象比较。如果给定对象与字符串相等,则返回 true;否则返回 false。该方法的源码如下:public boolean equals(...
    99+
    2015-04-07
    java
  • c语言怎么比较两个字符串是否相等
    在C语言中,可以使用strcmp函数来比较两个字符串是否相等。strcmp函数的原型为:int strcmp(const char ...
    99+
    2023-10-10
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作