最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

GO比較兩個(gè)對象是否相同實(shí)戰(zhàn)案例

 更新時(shí)間:2022年12月06日 09:57:17   作者:阿兵云原生  
我們時(shí)常有比較兩個(gè)值是否相等的需求,下面這篇文章主要給大家介紹了關(guān)于GO比較兩個(gè)對象是否相同的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

本文主要是來聊一聊關(guān)于 Golang 中的深度比較 DeepEqual

因?yàn)樽罱l(fā)現(xiàn)身邊的小伙伴寫 2 個(gè)或者多個(gè) map 比較的時(shí)候,都是自己去實(shí)現(xiàn)去比較每一個(gè)結(jié)構(gòu),每一個(gè)節(jié)點(diǎn)的 key 和 value 是不是都相等,且根據(jù)不同的數(shù)據(jù)結(jié)構(gòu),都要去實(shí)現(xiàn)一遍,沒有必要自己造輪子

我們知道,對于布爾類型,整形的,浮點(diǎn)類型,復(fù)數(shù),指針,字符串類型的值可以直接使用 == 來進(jìn)行比較,確認(rèn)雙方是否相等

甚至對于 channel 類型,也是可以使用 == 來進(jìn)行比較是否相等的

那么對于 golang 中的 切片 slice,數(shù)組 array,map,interface{},struct 結(jié)構(gòu)體我們?nèi)绾稳ミM(jìn)行比較呢?顯然使用 == 是不行的,此處的 m1 和 m2 是 map[string]int

此處你是否可能會想到 C++ 還可以去重載操作符,咱們實(shí)現(xiàn)一下對應(yīng)數(shù)據(jù)類型的操作符就可以了,妥妥的

你是否還會想到 PHP 中的 === 可以直接去比較數(shù)據(jù)的值和數(shù)據(jù)的類型,稱為全等比較運(yùn)算符

那么,看到此處,是否可以猜測 golang 的做法也是類似的呢?

實(shí)際上 golang 去比較兩個(gè)對象是否相同,也是通過去比較數(shù)據(jù)的類型,數(shù)據(jù)的值,數(shù)據(jù)的長度等等維度來進(jìn)行確認(rèn)的

C++ 是需要我們自己編碼實(shí)現(xiàn),PHP 是直接提供 === ,Golang 是給我們在反射包中提供一個(gè) DeepEqual 函數(shù)來進(jìn)行靈活使用

DeepEqual 案例

func DeepEqual(x, y interface{}) bool

很多朋友在不知道 golang 有提供 DeepEqual 功能的時(shí)候,比較 2 個(gè) map 可能會這樣去實(shí)現(xiàn):

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
}

當(dāng)然也沒有啥問題,但是如果這個(gè)時(shí)候需要我們比較兩個(gè)切片是否相等,兩個(gè)結(jié)構(gòu)體是否相等,甚至兩個(gè) interface{} 是否相等的時(shí)候,是不是都要去寫對應(yīng)的工具函數(shù)呢?

使用 DeepEqual 比較 map

兩個(gè)同一類型的 map,使用自己編寫的 mapEqual 和 使用 DeepEqual 我們得到的結(jié)果都是我們所期望的

但是對于 DeepEqual 來說,你可以傳入任何類型的數(shù)據(jù),入?yún)⑹?2 個(gè) interface{} 類型的數(shù)據(jù),響應(yīng)是 bool

對于 mapEqual 來說,你就只能傳入 map[string]int 類型的數(shù)據(jù),看到此處,自己造輪子,弊端還是很明顯的吧

自然,你也可以去將參數(shù)設(shè)計(jì)成 interface{} 類型的,然后再去進(jìn)行各種反射處理

可是明明有官方庫,何必自己再弄一遍呢,我們不應(yīng)該是吸收官方的思想和精華,站在巨佬的肩膀上去做更多有意義的事情嗎

使用 DeepEqual 比較 map 和 自定義類型

可使用 DeepEqual 的時(shí)候,一定要知道他的運(yùn)作機(jī)制和原理

例如下面的案例,我們自定義一個(gè)數(shù)據(jù)類型 myType實(shí)際上和 map[string]int 是一樣的, 可是我們?nèi)⒃?map[string]int 的 m1 和 myType 類型 m2 進(jìn)行比較的時(shí)候,他們實(shí)際上是不相等的

那么,看到這里,實(shí)際上 DeepEqual 自然是要比我們自己寫的 mapEqual 強(qiáng)太多了,他不僅關(guān)注數(shù)據(jù)的值,還會關(guān)注具體數(shù)據(jù)的類型,根據(jù)不同的數(shù)據(jù)類型,來進(jìn)行不同的數(shù)據(jù)校驗(yàn)和比較

DeepEqual 原理

DeepEqual 的代碼實(shí)現(xiàn)也非常簡單,參數(shù)中傳入 interface{}, 實(shí)現(xiàn)上會去確認(rèn)具體的數(shù)據(jù)類型,是否為空,如果是一般的的數(shù)據(jù)類型,那么直接使用 == 進(jìn)行比較即可

如果是其他的數(shù)據(jù)類型,那么就會遞歸的去調(diào)用 deepValueEqual 來一層一層的去校驗(yàn)數(shù)據(jù)和比較

為什么需要遞歸調(diào)用呢?

這個(gè)很明顯,例如對于一個(gè)切片來說,如果里面的元素是簡單的字符串,或者整型數(shù)字,那么第一層使用 deepValueEqual 去識別和處理切片的類型比較,讀取到切片元素的時(shí)候就可以直接走 == 來確認(rèn)是否相等

那么切片中也是可以是其他的任意數(shù)據(jù)結(jié)構(gòu)的,也可以是自定義的結(jié)構(gòu)體

因此在做這種比較的時(shí)候,遍歷到切片元素的時(shí)候,也要去確認(rèn)元素是什么類型的,如果是上述提到的非簡單類型,那么仍然需要繼續(xù)一層一層的識別他的類型,和他的值,再進(jìn)行逐個(gè)比較

例如這樣去比較這樣結(jié)構(gòu)的切片,真的完全有必要遞歸去一層一層的確認(rèn)數(shù)據(jù)類型和數(shù)值

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

var sli = []Node{...}

在比較的過程中,哪怕有一個(gè)環(huán)節(jié)不是我們所期望的,那么都會直接返回 false,即不相等

那么,仔細(xì)看 DeepEqual 的注釋,我們可以看到,這里有詳細(xì)的關(guān)于各種數(shù)據(jù)類型的比較和校驗(yàn)細(xì)節(jié),翻譯一下僅供大家參考,希望你有機(jī)會用到

  • 數(shù)組 Array

比較相同索引處的元素是否相等

  • 結(jié)構(gòu)體 struct

比較相應(yīng)字段,包括導(dǎo)出和不導(dǎo)出(此處表示字段開頭是大寫還是小寫)

  • 函數(shù) Func

只有當(dāng)函數(shù)為 nil 的時(shí)候,才會是相等的,其他情況都不相等

  • Interface{}

兩者都存在具體的值的時(shí)候,那么是相等的

  • Map

都為空的時(shí)候是可以是相等的

都不為空的時(shí)候,會去比較他們的長度,他們是否有相同的 key 且對應(yīng)相同的 value ,若都相同,則相等

  • 指針 pointer

可以直接使用 == 進(jìn)行比較,和 == 效果一致,或者指針指向的值是相等的

  • 切片 slice

都為 nil 的時(shí)候,是相等的

不為空的時(shí)候,會去比較他們的長度,且指向的底層數(shù)組也得有相同的元素,也就是指向底層數(shù)組的地址是相同的

  • 對于 other values 其他的數(shù)據(jù)類型,例如整型,布爾,字符串,通道

直接可以使用 == 來進(jìn)行比較, DeepEqual 的源碼實(shí)現(xiàn)對于這些類型的數(shù)據(jù)也是直接使用 == 比較的,簡單粗暴

總結(jié)

本次主要聊了關(guān)于

  • 非簡單數(shù)據(jù)類型的比較如何去處理
  • DeepEqual 的使用方式以及注意事項(xiàng)
  • DeepEqual 的原理和其支持的數(shù)據(jù)類型的判定規(guī)則

到此這篇關(guān)于GO比較兩個(gè)對象是否相同的文章就介紹到這了,更多相關(guān)GO比較兩個(gè)對象相同內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go換國內(nèi)源的方法步驟

    go換國內(nèi)源的方法步驟

    在中國境內(nèi),由于網(wǎng)絡(luò)原因,直接下載Go語言的包可能會遇到速度慢或下載失敗的問題,可以使用國內(nèi)的Go模塊代理來加速下載速度,本文就來介紹一下go換國內(nèi)源的方法步驟,感興趣的可以了解一下
    2024-09-09
  • Go1.20?arena新特性示例詳解

    Go1.20?arena新特性示例詳解

    這篇文章主要為大家介紹了Go1.20?arena新特性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Golang實(shí)現(xiàn)多存儲驅(qū)動(dòng)設(shè)計(jì)SDK案例

    Golang實(shí)現(xiàn)多存儲驅(qū)動(dòng)設(shè)計(jì)SDK案例

    這篇文章主要介紹了Golang實(shí)現(xiàn)多存儲驅(qū)動(dòng)設(shè)計(jì)SDK案例,Gocache是一個(gè)基于Go語言編寫的多存儲驅(qū)動(dòng)的緩存擴(kuò)展組件,更多具體內(nèi)容感興趣的小伙伴可以參考一下
    2022-09-09
  • go語言通過odbc操作Access數(shù)據(jù)庫的方法

    go語言通過odbc操作Access數(shù)據(jù)庫的方法

    這篇文章主要介紹了go語言通過odbc操作Access數(shù)據(jù)庫的方法,實(shí)例分析了Go語言通過odbc連接、查詢與關(guān)閉access數(shù)據(jù)庫的技巧,需要的朋友可以參考下
    2015-03-03
  • golang如何使用sarama訪問kafka

    golang如何使用sarama訪問kafka

    這篇文章主要介紹了golang如何使用sarama訪問kafka,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • golang如何通過viper讀取config.yaml文件

    golang如何通過viper讀取config.yaml文件

    這篇文章主要介紹了golang通過viper讀取config.yaml文件,圍繞golang讀取config.yaml文件的相關(guān)資料展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • 分析Go語言中CSP并發(fā)模型與Goroutine的基本使用

    分析Go語言中CSP并發(fā)模型與Goroutine的基本使用

    我們都知道并發(fā)是提升資源利用率最基礎(chǔ)的手段,尤其是當(dāng)今大數(shù)據(jù)時(shí)代,流量對于一家互聯(lián)網(wǎng)企業(yè)的重要性不言而喻。串流顯然是不行的,尤其是對于web后端這種流量的直接載體。并發(fā)是一定的,問題在于怎么執(zhí)行并發(fā)。常見的并發(fā)方式有三種,分別是多進(jìn)程、多線程和協(xié)程
    2021-06-06
  • go 實(shí)現(xiàn)簡易端口掃描的示例

    go 實(shí)現(xiàn)簡易端口掃描的示例

    該功能實(shí)現(xiàn)原理很簡單,就是發(fā)送socket連接(IP+端口),如果能連接成功,說明目標(biāo)主機(jī)開放了某端口。當(dāng)要大量掃描端口時(shí),就需要寫并發(fā)編程了。
    2021-05-05
  • 詳解Go?語言如何通過測試保證質(zhì)量

    詳解Go?語言如何通過測試保證質(zhì)量

    這篇文章主要為大家介紹了Go?語言如何通過測試保證質(zhì)量詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • go寫文件后出現(xiàn)大量NUL字符問題解決

    go寫文件后出現(xiàn)大量NUL字符問題解決

    本文主要介紹了go寫文件后出現(xiàn)大量NUL字符問題解決,由于每次寫的時(shí)候設(shè)置的長度都是64,在某次不足64時(shí),byte切片空余位置被填充為空字符,下面就來介紹一下如何解決
    2023-12-12

最新評論

格尔木市| 延边| 达尔| 晋州市| 吴江市| 肇源县| 隆尧县| 石阡县| 霍林郭勒市| 盱眙县| 博爱县| 锦屏县| 烟台市| 聂荣县| 茌平县| 招远市| 新安县| 潜山县| 岳阳市| 醴陵市| 兴山县| 平顶山市| 呼伦贝尔市| 宁武县| 蓬安县| 怀来县| 博野县| 尖扎县| 兴安盟| 绥滨县| 长泰县| 全椒县| 张北县| 旅游| 玉树县| 大理市| 烟台市| 宕昌县| 濉溪县| 营山县| 丹棱县|