日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

GO 比較兩個對象是否相同

來源: 責編: 時間:2023-10-06 19:19:47 264觀看
導讀本文主要是來聊一聊關于 Golang 中的深度比較 DeepEqual因為最近發現身邊的小伙伴寫 2 個或者多個 map 比較的時候,都是自己去實現去比較每一個結構,每一個節點的 key 和 value 是不是都相等,且根據不同的數據結構,都要去

本文主要是來聊一聊關于 Golang 中的深度比較 DeepEquale8128資訊網——每日最新資訊28at.com

因為最近發現身邊的小伙伴寫 2 個或者多個 map 比較的時候,都是自己去實現去比較每一個結構,每一個節點的 key 和 value 是不是都相等,且根據不同的數據結構,都要去實現一遍,沒有必要自己造輪子e8128資訊網——每日最新資訊28at.com

我們知道,對于布爾類型,整形的,浮點類型,復數,指針,字符串類型的值可以直接使用 == 來進行比較,確認雙方是否相等e8128資訊網——每日最新資訊28at.com

甚至對于 channel 類型,也是可以使用 == 來進行比較是否相等的e8128資訊網——每日最新資訊28at.com

那么對于 golang 中的 切片 slice,數組 array,map,interface{},struct 結構體我們如何去進行比較呢?顯然使用 == 是不行的,此處的 m1 和 m2 是 map[string]inte8128資訊網——每日最新資訊28at.com

圖片圖片e8128資訊網——每日最新資訊28at.com

此處你是否可能會想到 C++ 還可以去重載操作符,咱們實現一下對應數據類型的操作符就可以了,妥妥的e8128資訊網——每日最新資訊28at.com

你是否還會想到 PHP 中的 === 可以直接去比較數據的值和數據的類型,稱為全等比較運算符e8128資訊網——每日最新資訊28at.com

那么,看到此處,是否可以猜測 golang 的做法也是類似的呢?e8128資訊網——每日最新資訊28at.com

實際上 golang 去比較兩個對象是否相同,也是通過去比較數據的類型,數據的值,數據的長度等等維度來進行確認的e8128資訊網——每日最新資訊28at.com

C++ 是需要我們自己編碼實現,PHP 是直接提供 === ,Golang 是給我們在反射包中提供一個 DeepEqual 函數來進行靈活使用e8128資訊網——每日最新資訊28at.com

DeepEqual 案例

圖片圖片e8128資訊網——每日最新資訊28at.com

func DeepEqual(x, y interface{}) bool

很多朋友在不知道 golang 有提供 DeepEqual 功能的時候,比較 2 個 map 可能會這樣去實現:e8128資訊網——每日最新資訊28at.com

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{} 是否相等的時候,是不是都要去寫對應的工具函數呢?e8128資訊網——每日最新資訊28at.com

使用 DeepEqual 比較 map

圖片圖片e8128資訊網——每日最新資訊28at.com

兩個同一類型的 map,使用自己編寫的 mapEqual 和 使用 DeepEqual 我們得到的結果都是我們所期望的e8128資訊網——每日最新資訊28at.com

但是對于 DeepEqual 來說,你可以傳入任何類型的數據,入參是 2 個 interface{} 類型的數據,響應是 boole8128資訊網——每日最新資訊28at.com

對于 mapEqual 來說,你就只能傳入 map[string]int 類型的數據,看到此處,自己造輪子,弊端還是很明顯的吧e8128資訊網——每日最新資訊28at.com

自然,你也可以去將參數設計成 interface{} 類型的,然后再去進行各種反射處理e8128資訊網——每日最新資訊28at.com

可是明明有官方庫,何必自己再弄一遍呢,我們不應該是吸收官方的思想和精華,站在巨佬的肩膀上去做更多有意義的事情嗎e8128資訊網——每日最新資訊28at.com

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

可使用 DeepEqual 的時候,一定要知道他的運作機制和原理e8128資訊網——每日最新資訊28at.com

例如下面的案例,我們自定義一個數據類型 myType,實際上和 map[string]int 是一樣的, 可是我們去將原生的 map[string]int 的 m1 和 myType 類型 m2 進行比較的時候,他們實際上是不相等的e8128資訊網——每日最新資訊28at.com

圖片圖片e8128資訊網——每日最新資訊28at.com

那么,看到這里,實際上 DeepEqual 自然是要比我們自己寫的 mapEqual 強太多了,他不僅關注數據的值,還會關注具體數據的類型,根據不同的數據類型,來進行不同的數據校驗和比較e8128資訊網——每日最新資訊28at.com

DeepEqual 原理

DeepEqual 的代碼實現也非常簡單,參數中傳入 interface{}, 實現上會去確認具體的數據類型,是否為空,如果是一般的的數據類型,那么直接使用 == 進行比較即可e8128資訊網——每日最新資訊28at.com

如果是其他的數據類型,那么就會遞歸的去調用 deepValueEqual 來一層一層的去校驗數據和比較e8128資訊網——每日最新資訊28at.com

為什么需要遞歸調用呢?e8128資訊網——每日最新資訊28at.com

這個很明顯,例如對于一個切片來說,如果里面的元素是簡單的字符串,或者整型數字,那么第一層使用 deepValueEqual 去識別和處理切片的類型比較,讀取到切片元素的時候就可以直接走 == 來確認是否相等e8128資訊網——每日最新資訊28at.com

那么切片中也是可以是其他的任意數據結構的,也可以是自定義的結構體e8128資訊網——每日最新資訊28at.com

因此在做這種比較的時候,遍歷到切片元素的時候,也要去確認元素是什么類型的,如果是上述提到的非簡單類型,那么仍然需要繼續一層一層的識別他的類型,和他的值,再進行逐個比較e8128資訊網——每日最新資訊28at.com

例如這樣去比較這樣結構的切片,真的完全有必要遞歸去一層一層的確認數據類型和數值type Node struct{   M map[string]int   In interface{}   Sli []map[int][chan int]}var sli = []Node{...}

在比較的過程中,哪怕有一個環節不是我們所期望的,那么都會直接返回 false,即不相等e8128資訊網——每日最新資訊28at.com

圖片圖片e8128資訊網——每日最新資訊28at.com

那么,仔細看 DeepEqual 的注釋,我們可以看到,這里有詳細的關于各種數據類型的比較和校驗細節,翻譯一下僅供大家參考,希望你有機會用到e8128資訊網——每日最新資訊28at.com

  • 數組 Array

比較相同索引處的元素是否相等e8128資訊網——每日最新資訊28at.com

  • 結構體 struct

比較相應字段,包括導出和不導出(此處表示字段開頭是大寫還是小寫)e8128資訊網——每日最新資訊28at.com

  • 函數 Func

只有當函數為 nil 的時候,才會是相等的,其他情況都不相等e8128資訊網——每日最新資訊28at.com

  • Interface{}

兩者都存在具體的值的時候,那么是相等的e8128資訊網——每日最新資訊28at.com

  • Map

都為空的時候是可以是相等的e8128資訊網——每日最新資訊28at.com

都不為空的時候,會去比較他們的長度,他們是否有相同的 key 且對應相同的 value ,若都相同,則相等e8128資訊網——每日最新資訊28at.com

  • 指針 pointer

可以直接使用 == 進行比較,和 == 效果一致,或者指針指向的值是相等的e8128資訊網——每日最新資訊28at.com

  • 切片 slice

都為 nil 的時候,是相等的e8128資訊網——每日最新資訊28at.com

不為空的時候,會去比較他們的長度,且指向的底層數組也得有相同的元素,也就是指向底層數組的地址是相同的e8128資訊網——每日最新資訊28at.com

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

直接可以使用 == 來進行比較, DeepEqual 的源碼實現對于這些類型的數據也是直接使用 == 比較的,簡單粗暴e8128資訊網——每日最新資訊28at.com

總結

本次主要聊了關于e8128資訊網——每日最新資訊28at.com

  • 非簡單數據類型的比較如何去處理
  • DeepEqual 的使用方式以及注意事項
  • DeepEqual 的原理和其支持的數據類型的判定規則

本文鏈接:http://www.www897cc.com/showinfo-26-12137-0.htmlGO 比較兩個對象是否相同

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 計數排序(Counting Sort)詳解

下一篇: 十個事半功倍的IntelliJ Idea插件和主題

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 疏勒县| 基隆市| 宜兰市| 日喀则市| 盐池县| 德庆县| 南通市| 兰州市| 桦川县| 镇远县| 宣城市| 宝鸡市| 泊头市| 都昌县| 陆良县| 张北县| 崇义县| 扶沟县| 筠连县| 桐梓县| 万山特区| 景泰县| 白城市| 普兰店市| 德州市| 炎陵县| 濮阳市| 武陟县| 英超| 班玛县| 吴堡县| 蒲江县| 莱西市| 萝北县| 哈密市| 搜索| 阜阳市| 禄劝| 黄石市| 福泉市| 贡山|