詳解Golang如何比較兩個(gè)slice是否相等
前言
開發(fā)中經(jīng)常會(huì)遇到需要比較兩個(gè)slice
包含的元素是否完全相等的情況,在golang
中是不能夠直接通過(guò) ==
來(lái)判斷兩個(gè)切片是否相等的,我們通常會(huì)通過(guò)兩種方法去比較切片是否相等,這里通過(guò)幾個(gè)示例來(lái)看一下這兩種方法,感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
判斷兩個(gè)[]byte是否相等
因?yàn)樵?code>bytes標(biāo)準(zhǔn)庫(kù)中提供了[]byte
的比較方法,所以我們不再需要重復(fù)造輪子了;示例如下:
package main import ( "bytes" "fmt" ) func main() { a := []byte{1,2,3} b := []byte{1,2} c := []byte{1,2,3} fmt.Println(bytes.Equal(a,b)) fmt.Println(bytes.Equal(a,c)) }
執(zhí)行代碼輸出如下:
使用reflect判斷slice是否相等
我們還可以借助reflect包的reflect.DeepEqual方法來(lái)比較兩個(gè)切片是否相等。這個(gè)寫法很簡(jiǎn)單:
// ReflectDeepEqual 直接使用 reflect 包的 reflect.DeepEqual 方法進(jìn)行比較 func StringSliceReflectEqual(a, b []string) bool { return reflect.DeepEqual(a, b) }
手寫循環(huán)遍歷比較
我們都知道Golang中reflect效率很低,使用reflect通常需要付出性能代價(jià),如果我們確定了slice的類型,那么自己實(shí)現(xiàn)slice的相等判斷相對(duì)來(lái)說(shuō)也不是那么麻煩:
// LoopCompare 循環(huán)遍歷比較 // 先比較兩個(gè)數(shù)的長(zhǎng)度是否相等 // 再循環(huán)遍歷每一個(gè)元素進(jìn)行比較 func LoopCompare(a, b []int) bool { if len(a) != len(b) { return false } //與reflect.DeepEqual的結(jié)果保持一致:[]int{} != []int(nil) if (a == nil) != (b == nil) { return false } for i, v := range a { if v != b[i] { return false } } return true }
性能比較
借助Benchmark來(lái)簡(jiǎn)單的測(cè)試比較下二者的性能。
package test import ( "reflect" "testing" ) var ( testA = []int{1,3,5,9,11,13} testB = []int{1,3,5,9,11,13,17,23} ) // BenchmarkReflectDeepEqual 測(cè)試 reflect.DeepEqual 效率 func BenchmarkReflectDeepEqual(b *testing.B) { for n := 0; n < b.N; n++ { ReflectDeepEqual(testA, testB) } } // BenchmarkLoopCompare 測(cè)試 循環(huán)比較 效率 func BenchmarkLoopCompare(b *testing.B) { for n := 0; n < b.N; n++ { LoopCompare(testA, testB) } }
在測(cè)試文件所在目錄執(zhí)行go test -bench=.
命令
Benchmark對(duì)比測(cè)試結(jié)果:
根據(jù)測(cè)試結(jié)果我們可以得到:
- 使用reflect的方式,649 ns完成一次操作;
- 使用循環(huán)遍歷的方式,12.7 ns完成一次比較,效率對(duì)比十分明顯。
原因在于reflect 接收任意類型的參數(shù),方法內(nèi)部要對(duì)類型做判斷;循環(huán)遍歷僅支持已知固定類型,效率自然要高些。所以就只能忍痛放棄reflect了。
總結(jié)
以上就是整理的golang 判斷 兩個(gè)slice 是否相等全部?jī)?nèi)容,我們可以借助reflect包的reflect.DeepEqual方法來(lái)比較兩個(gè)切片是否相等,但是效率比較低,如果我們確定了slice的類型,我們可以手寫遍歷循環(huán)的方式來(lái)比較,相對(duì)效率比較高,希望文章能夠幫你解決golang 判斷 兩個(gè)slice 是否相等所遇到的程序開發(fā)問(wèn)題。
到此這篇關(guān)于詳解Golang如何比較兩個(gè)slice是否相等的文章就介紹到這了,更多相關(guān)Golang比較slice是否相等內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言學(xué)習(xí)技巧之如何合理使用Pool
這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言學(xué)習(xí)技巧之如何合理使用Pool的相關(guān)資料,Pool用于存儲(chǔ)那些被分配了但是沒(méi)有被使用,而未來(lái)可能會(huì)使用的值,以減小垃圾回收的壓力。文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12golang模擬實(shí)現(xiàn)帶超時(shí)的信號(hào)量示例代碼
這篇文章主要給大家介紹了關(guān)于golang模擬實(shí)現(xiàn)帶超時(shí)的信號(hào)量的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09一文帶你揭秘Go中new()和make()函數(shù)的區(qū)別和用途
Go(或 Golang)是一種現(xiàn)代、靜態(tài)類型、編譯型的編程語(yǔ)言,專為構(gòu)建可擴(kuò)展、并發(fā)和高效的軟件而設(shè)計(jì),它提供了各種內(nèi)置的函數(shù)和特性,幫助開發(fā)人員編寫簡(jiǎn)潔高效的代碼,在本博客文章中,我們將探討 new() 和 make() 函數(shù)之間的區(qū)別,了解何時(shí)以及如何有效地使用它們2023-10-10Go語(yǔ)言編程實(shí)現(xiàn)支持六種級(jí)別的日志庫(kù)?
這篇文章主要為大家介紹了使用Golang編寫一個(gè)支持六種級(jí)別的日志庫(kù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05