Golang之 ==和deepEqual
生活随笔
收集整理的這篇文章主要介紹了
Golang之 ==和deepEqual
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Slice,Map,函數三種引用類型以及含有以上三種類型的結構體和數組不能直接用==比較,只能用reflect.deepEqual進行比較。
channel可以用==比較,且只有兩個通道是由同一個 make 創建才相等;
接口可以用==比較,且只有兩個接口具有相同的動態類型和動態值兩者才相等;并且當 interface 與非 interface 比較時,會將非interface 轉換成 interface,然后再按照?兩個 interface 比較?的規則進行比較;接口的動態類型和動態值都為nil,接口才是nil。
結構體和數組作為復合類型,能否比較以其內部的元素是否能比較決定,且數組要求長度相同。
空結構體不可相互比較:
-
若逃逸到堆上,空結構體則默認分配的是?runtime.zerobase?變量,是專門用于分配到堆上的 0 字節基礎地址。因此兩個空結構體都是?runtime.zerobase,一比較當然就是 true 了。
-
若沒有發生逃逸,也就分配到棧上,在 Go 編譯器的代碼優化階段,會對其進行優化,直接返回 false。并沒有比較的意義了。
總結
以上是生活随笔為你收集整理的Golang之 ==和deepEqual的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Golang之var、new与make、
- 下一篇: 程序员看《长安十二时辰》的正确姿势~!