在判斷是否相等之前,我們先看下go中的類型都有哪些吧,不同類型比較方式不同
1、可用 == 和 != 直接比較的類型
bool布爾類型;
數值類型:兩個值具有相同的數值類型或者可以轉化為相同的類型;
string字符串;
指針:比較兩個指針是否指向內存中的同一個值,或者都為 nil;
channel:比較兩個channel是否來自同一個 make 的調用,或者都為 nil。
此外,如果 struct 和 數組是由這些可比較類型組成的,那么它們也可以進行比較相等性。
但是,map 和 slice 無法通過 == 和 != 比較相等性。
// bool,
// 數值型:int
// string, 指針, channel
a == b
// 由以上幾種類型組成的 struct 和 數組
2、派生類型比較
(a) 指針類型(Pointer)【可用和!=】
(b) 數組類型
(c) 結構化類型(struct)
(d) channel 類型【可用和!=】
(e) 函數類型
(f) 切片類型(slice)
(g) 接口類型(interface)
(h) map 類型
---下面未整理完---
2、[]byte(slice類型)
bytes.Equal(a,b)
3、[]xx(非byte類型的兩個slice)
非byte類型的slice,即[]xx,我們還可以借助reflect.DeepEqual,用於深度比較兩個對象包括它們內部包含的元素是否都相等:
func DeepEqual(x, y interface{}) bool
a := []byte{1, 2, 3}
b := []byte{0, 1, 3, 2}
reflect.DeepEqual(a, b)
但是,reflect的代價要大得多,非必要別用DeepEqual!
參考:
https://www.cnblogs.com/apocelipes/p/11116725.html
https://www.bilibili.com/read/cv11994623