詳解Golang如何比較兩個(gè)slice是否相等
前言
開發(fā)中經(jīng)常會(huì)遇到需要比較兩個(gè)slice包含的元素是否完全相等的情況,在golang中是不能夠直接通過 == 來判斷兩個(gè)切片是否相等的,我們通常會(huì)通過兩種方法去比較切片是否相等,這里通過幾個(gè)示例來看一下這兩種方法,感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
判斷兩個(gè)[]byte是否相等
因?yàn)樵?code>bytes標(biāo)準(zhǔn)庫中提供了[]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方法來比較兩個(gè)切片是否相等。這個(gè)寫法很簡單:
// 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ì)來說也不是那么麻煩:
// LoopCompare 循環(huán)遍歷比較
// 先比較兩個(gè)數(shù)的長度是否相等
// 再循環(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來簡單的測(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 是否相等全部內(nèi)容,我們可以借助reflect包的reflect.DeepEqual方法來比較兩個(gè)切片是否相等,但是效率比較低,如果我們確定了slice的類型,我們可以手寫遍歷循環(huán)的方式來比較,相對(duì)效率比較高,希望文章能夠幫你解決golang 判斷 兩個(gè)slice 是否相等所遇到的程序開發(fā)問題。
到此這篇關(guān)于詳解Golang如何比較兩個(gè)slice是否相等的文章就介紹到這了,更多相關(guān)Golang比較slice是否相等內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node-exporter被檢測(cè)出來pprof調(diào)試信息泄露漏洞問題
這篇文章主要介紹了node-exporter被檢測(cè)出來pprof調(diào)試信息泄露漏洞問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
golang 64位linux環(huán)境下編譯出32位程序操作
這篇文章主要介紹了golang 64位linux環(huán)境下編譯出32位程序操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Go緩沖channel和非緩沖channel的區(qū)別說明
這篇文章主要介紹了Go緩沖channel和非緩沖channel的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04

