Go 的 slice、map、func 不能用相等運算子比較

Go 只有一種相等比較 a == b,而且型別不同在編譯期就報錯,不會像 JS 那樣執行期硬轉。但有三種型別根本不能比

型別能用相等運算子?
數值、字串、bool、pointer
structarray✅ 內容完全一樣才是 true
slicemapfunc❌ 編譯錯誤,唯一例外是跟 nil

要比 slice 的內容得明講:

slice1 := []int{1, 2}
slice2 := []int{1, 2}
 
reflect.DeepEqual(slice1, slice2)   // true,但走 reflection,慢
slices.Equal(slice1, slice2)        // true,Go 1.21+ 標準庫,型別安全且快

為什麼不給比

因為 slice 是一扇窗戶,「兩扇窗戶相等」語意不明——比指標?比 len?比 cap?比內容?Go 不替你選一個預設答案,直接讓它編譯不過,逼呼叫端把意圖寫出來。

array 可以比就是因為它沒有這個歧義:長度是型別的一部分,值就是全部的內容。

相關:Go 的基本型別與預設推斷型別