首頁 > 軟體

詳解Golang如何比較兩個slice是否相等

2022-11-21 14:01:28

前言

開發中經常會遇到需要比較兩個slice包含的元素是否完全相等的情況,在golang中是不能夠直接通過 == 來判斷兩個切片是否相等的,我們通常會通過兩種方法去比較切片是否相等,這裡通過幾個範例來看一下這兩種方法,感興趣的小夥伴們可以參考借鑑,希望對大家能有所幫助。

判斷兩個[]byte是否相等

因為在bytes標準庫中提供了[]byte的比較方法,所以我們不再需要重複造輪子了;範例如下:

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))
}

執行程式碼輸出如下:

使用reflect判斷slice是否相等

我們還可以藉助reflect包的reflect.DeepEqual方法來比較兩個切片是否相等。這個寫法很簡單:

// ReflectDeepEqual 直接使用 reflect 包的 reflect.DeepEqual 方法進行比較
func StringSliceReflectEqual(a, b []string) bool {
    return reflect.DeepEqual(a, b)
}

手寫回圈遍歷比較

我們都知道Golang中reflect效率很低,使用reflect通常需要付出效能代價,如果我們確定了slice的型別,那麼自己實現slice的相等判斷相對來說也不是那麼麻煩:

// LoopCompare 迴圈遍歷比較
// 先比較兩個數的長度是否相等
// 再回圈遍歷每一個元素進行比較
func LoopCompare(a, b []int) bool {
    if len(a) != len(b) {
        return false
    }
    //與reflect.DeepEqual的結果保持一致:[]int{} != []int(nil)
    if (a == nil) != (b == nil) {
        return false
    }
    for i, v := range a {
        if v != b[i] {
            return false
        }
    }
    return true
}

效能比較

藉助Benchmark來簡單的測試比較下二者的效能。

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 測試 reflect.DeepEqual 效率
func BenchmarkReflectDeepEqual(b *testing.B) {
	for n := 0; n < b.N; n++ {
		ReflectDeepEqual(testA, testB)
	}
}

// BenchmarkLoopCompare 測試 迴圈比較 效率
func BenchmarkLoopCompare(b *testing.B) {
	for n := 0; n < b.N; n++ {
		LoopCompare(testA, testB)
	}
}

在測試檔案所在目錄執行go test -bench=.命令

Benchmark對比測試結果:

根據測試結果我們可以得到:

  • 使用reflect的方式,649 ns完成一次操作;
  • 使用迴圈遍歷的方式,12.7 ns完成一次比較,效率對比十分明顯。

原因在於reflect 接收任意型別的引數,方法內部要對型別做判斷;迴圈遍歷僅支援已知固定型別,效率自然要高些。所以就只能忍痛放棄reflect了。

總結

以上就是整理的golang 判斷 兩個slice 是否相等全部內容,我們可以藉助reflect包的reflect.DeepEqual方法來比較兩個切片是否相等,但是效率比較低,如果我們確定了slice的型別,我們可以手寫遍歷迴圈的方式來比較,相對效率比較高,希望文章能夠幫你解決golang 判斷 兩個slice 是否相等所遇到的程式開發問題。

到此這篇關於詳解Golang如何比較兩個slice是否相等的文章就介紹到這了,更多相關Golang比較slice是否相等內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com