Go 的 slice、map、func 不能用相等運算子比較
Go 只有一種相等比較
a == b,而且型別不同在編譯期就報錯,不會像 JS 那樣執行期硬轉。但有三種型別根本不能比。
| 型別 | 能用相等運算子? |
|---|---|
| 數值、字串、bool、pointer | ✅ |
struct、array | ✅ 內容完全一樣才是 true |
slice、map、func | ❌ 編譯錯誤,唯一例外是跟 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 可以比就是因為它沒有這個歧義:長度是型別的一部分,值就是全部的內容。