天天看點

go的struct能比較嗎

struct能不能比較? 很顯然這句話包含了兩種情況:

同一個struct的兩個執行個體能不能比較?

兩個不同的struct的執行個體能不能比較?

運作上面的代碼發現會列印false。既然能正常列印輸出,說明是可以個比較的,接下來讓我們來個死亡兩問

什麼可以比較?

回到上面的劃重點部分,在總結中我們可以知道,golang中 Slice,Map,Function 這三種資料類型是不可以直接比較的。我們再看看S結構體,該結構體并沒有包含不可比較的成員變量,是以該結構體是可以直接比較的。

為什麼列印輸出false?

a 和 b 雖然是同一個struct 的兩個執行個體,但是因為其中的指針變量 Address 的值不同,是以 a != b,如果a b 在初始化時把 Address 去掉(不給 Address 初始化),那麼這時 a == b 為true, 因為ptr變量預設值是nil,又或者給 Address 成員變量賦上同一個指針變量的值,也是成立的。

如果給結構體S增加一個Slice類型的成員變量後又是什麼情況呢?

這時候會列印輸出什麼呢?true?false?實際上運作上面的代碼會報下面的錯誤:

a, b 雖然是同一個struct兩個指派相同的執行個體,因為結構體成員變量中帶有了不能比較的成員(slice),是不可以直接用 == 比較的,是以隻要寫 == 就報錯

同一個struct的兩個執行個體可比較也不可比較,當結構不包含不可直接比較成員變量時可直接比較,否則不可直接比較

但在平時的實踐過程中,當我們需要對含有不可直接比較的資料類型的結構體執行個體進行比較時,是不是就沒法比較了呢?事實上并非如此,golang還是友好滴,我們可以借助 reflect.DeepEqual 函數 來對兩個變量進行比較。是以上面代碼我們可以這樣寫:

結論:可以比較,也不可以比較

可通過強制轉換來比較:

如果成員變量中含有不可比較成員變量,即使可以強制轉換,也不可以比較

struct必須是可比較的,才能作為key,否則編譯時報錯

編譯時會報錯 去掉Address就可

繼續閱讀