Golang?中判斷兩個(gè)結(jié)構(gòu)體相等的方法
結(jié)論
golang中,哪些數(shù)據(jù)類型是可比較的,哪些是不可比較的:
- 可比較:Integer,F(xiàn)loating-point,String,Boolean,Complex(復(fù)數(shù)型),Pointer,Channel,Interface,Array
- 不可比較:Slice,Map,F(xiàn)unction
同一個(gè)struct的兩個(gè)實(shí)例能不能比較
type S struct { Name string Age int Address *int } func main() { a := S{ Name: "aa", Age: 1, Address: new(int), } b := S{ Name: "aa", Age: 1, Address: new(int), } fmt.Println(a == b) // false }
輸出false,說(shuō)明:
- 可以比較,因?yàn)槎际腔A(chǔ)數(shù)據(jù)類型
- false:因?yàn)槠渲械闹羔樧兞?Address 的值不同,所以 a != b,如果a b 在初始化時(shí)把 Address 去掉(不給 Address 初始化),那么這時(shí) a == b 為true, 因?yàn)閜tr變量默認(rèn)值是nil,又或者給 Address 成員變量賦上同一個(gè)指針變量的值,也是成立的。
type S struct { Name string Age int Address *int Data []int } func main() { a := S{ Name: "aa", Age: 1, Address: new(int), Data: []int{1, 2, 3}, } b := S{ Name: "aa", Age: 1, Address: new(int), Data: []int{1, 2, 3}, } fmt.Println(a == b) // invalid operation: a == b (struct containing []int cannot be compared) }
報(bào)錯(cuò):Slice,Map,F(xiàn)unction不可比較
結(jié)構(gòu)體比較推薦用法
type S struct { Name string Age int Address *int Data []int } func main() { a := S{ Name: "aa", Age: 1, Address: new(int), Data: []int{1, 2, 3}, } b := S{ Name: "aa", Age: 1, Address: new(int), Data: []int{1, 2, 3}, } fmt.Println(reflect.DeepEqual(a, b)) // true }
DeepEqual函數(shù)用來(lái)判斷兩個(gè)值是否深度一致。具體比較規(guī)則如下:
- 不同類型的值永遠(yuǎn)不會(huì)深度相等
- 當(dāng)兩個(gè)數(shù)組的元素對(duì)應(yīng)深度相等時(shí),兩個(gè)數(shù)組深度相等
- 當(dāng)兩個(gè)相同結(jié)構(gòu)體的所有字段對(duì)應(yīng)深度相等的時(shí)候,兩個(gè)結(jié)構(gòu)體深度相等
- 當(dāng)兩個(gè)函數(shù)都為nil時(shí),兩個(gè)函數(shù)深度相等,其他情況不相等(相同函數(shù)也不相等)
- 當(dāng)兩個(gè)interface的真實(shí)值深度相等時(shí),兩個(gè)interface深度相等
- map的比較需要同時(shí)滿足以下幾個(gè)
- -兩個(gè)map都為nil或者都不為nil,并且長(zhǎng)度要相等
- -相同的map對(duì)象或者所有key要對(duì)應(yīng)相同
- -map對(duì)應(yīng)的value也要深度相等
- 指針,滿足以下其一即是深度相等
- -兩個(gè)指針滿足go的==操作符
- -兩個(gè)指針指向的值是深度相等的
- 切片,需要同時(shí)滿足以下幾點(diǎn)才是深度相等
- -兩個(gè)切片都為nil或者都不為nil,并且長(zhǎng)度要相等
- -兩個(gè)切片底層數(shù)據(jù)指向的第一個(gè)位置要相同或者底層的元素要深度相等
- -注意:空的切片跟nil切片是不深度相等的
- 其他類型的值(numbers, bools, strings, channels)如果滿足go的==操作符,則是深度相等的。要注意不是所有的值都深度相等于自己,例如函數(shù),以及嵌套包含這些值的結(jié)構(gòu)體,數(shù)組等
到此這篇關(guān)于Golang 中如何判斷兩個(gè)結(jié)構(gòu)體相等的文章就介紹到這了,更多相關(guān)go判斷兩個(gè)結(jié)構(gòu)體相等內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片
- go語(yǔ)言中結(jié)構(gòu)體tag使用小結(jié)
- Go語(yǔ)言中結(jié)構(gòu)體的高級(jí)技巧分享
- Go中匿名結(jié)構(gòu)體的使用技巧
- 詳解Golang time包中的結(jié)構(gòu)體time.Ticker
- 詳解Golang time包中的結(jié)構(gòu)體time.Time
- 詳解Go語(yǔ)言中的結(jié)構(gòu)體的特性
- 一文帶你感受Go語(yǔ)言空結(jié)構(gòu)體的魔力
- 細(xì)說(shuō)Go語(yǔ)言中空結(jié)構(gòu)體的奇妙用途
- 一文帶你掌握掌握 Golang結(jié)構(gòu)體與方法
- 深入理解Go語(yǔ)言中的結(jié)構(gòu)體
相關(guān)文章
Go語(yǔ)言設(shè)計(jì)模式之實(shí)現(xiàn)觀察者模式解決代碼臃腫
今天學(xué)習(xí)一下用?Go?實(shí)現(xiàn)觀察者模式,觀察者模式主要是用來(lái)實(shí)現(xiàn)事件驅(qū)動(dòng)編程。事件驅(qū)動(dòng)編程的應(yīng)用還是挺廣的,除了我們都知道的能夠用來(lái)解耦:用戶修改密碼后,給用戶發(fā)短信進(jìn)行風(fēng)險(xiǎn)提示之類的典型場(chǎng)景,在微服務(wù)架構(gòu)實(shí)現(xiàn)最終一致性、實(shí)現(xiàn)事件源A?+?ES2022-08-08Golang通過(guò)小程序獲取微信openid的方法示例
這篇文章主要介紹了Golang通過(guò)小程序獲取微信openid的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Go實(shí)現(xiàn)一個(gè)輕量級(jí)并發(fā)任務(wù)調(diào)度器(支持限速)
本文主要介紹了Go實(shí)現(xiàn)一個(gè)輕量級(jí)并發(fā)任務(wù)調(diào)度器(支持限速),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04go語(yǔ)言編程實(shí)現(xiàn)遞歸函數(shù)示例詳解
這篇文章主要為大家介紹了go語(yǔ)言編程實(shí)現(xiàn)遞歸函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09