首頁 > 後端開發 > Golang > golang中判斷兩個slice是否相等

golang中判斷兩個slice是否相等

藏色散人
發布: 2021-04-02 15:13:09
轉載
2330 人瀏覽過

下面由golang教程欄位給大家介紹golang中判斷兩個slice是否相等與判斷值下的陣列是否相等,希望對需要的朋友有所幫助!

golang中判斷兩個slice是否相等

在golang中我們可以輕鬆地透過==來判斷兩個陣列(array)是否相等,但遺憾的是slice並沒有相關的運算符,當需要判斷兩個slice是否相等時我們只能另尋捷徑了。

slice相等的定義

我們選擇最常見的需求,也就是當兩個slice的型別和長度相同,且相等下標的值也是相等的,例如:

a := []int{1, 2, 3}b := []int{1, 2, 3}c := []int{1, 2}d := []int{1, 3, 2}
登入後複製

上述程式碼中ab是相等的,c因為長度和a不同所以不相等,d因為元素的排列順序和a不同所以也不相等。

判斷兩個[]byte是否相等

為什麼要單獨將[]byte列舉出來呢?

因為標準函式庫提供了最佳化的比較方案,不再需要我們造輪子了:

package mainimport (
    "bytes"
    "fmt")func main() {
    a := []byte{0, 1, 3, 2}
    b := []byte{0, 1, 3, 2}
    c := []byte{1, 1, 3, 2}

    fmt.Println(bytes.Equal(a, b))
    fmt.Println(bytes.Equal(a, c))}
登入後複製

使用reflect判斷slice(陣列)是否相等

在判斷類型不是[]byte的slice時,我們也可以藉助reflect.DeepEqual,它用於深度比較兩個物件包括它們內部包含的元素是否都相等:

func DeepEqual(x, y interface{}) bool
登入後複製

DeepEqual reports whether x and y are “deeply equal,” defined as follows. Two values of identical type are deeply equal if one of the following cases applies. Values of dily equal if one of the following cases applies。
Slice values are deeply equal when all of the following are true: they are both nil or both non-nil, they have the same length, and either they point to the same initial entry of the same under ing same initial entry of the sarray ing ing same sarray, &x[0] == &y[0]) or their corresponding elements (up to length) are deeply equal. Note that a non-nil empty slice and a nil slice (for example, []byte{} and []byte( nil)) are not deeply equal.

這段話的意思不難理解,和我們在本文最開始時討論的如何確定slice相等的原則是一樣的,只不過它藉助了一點運行時的「黑魔法」。

看範例:

package mainimport (
    "fmt"
    "reflect")func main() {
    a := []int{1, 2, 3, 4}
    b := []int{1, 3, 2, 4}
    c := []int{1, 2, 3, 4}
    fmt.Println(reflect.DeepEqual(a, b))
    fmt.Println(reflect.DeepEqual(a, c))}
登入後複製

手寫判斷

#在golang中使用reflect通常需要付出效能代價,如果我們確定了slice的類型,那麼自己實作slice的相等判斷相對來說也不是那麼麻煩:

func testEq(a, b []int) bool {
    // If one is nil, the other must also be nil.
    if (a == nil) != (b == nil) {
        return false;
    }

    if len(a) != len(b) {
        return false
    }

    for i := range a {
        if a[i] != b[i] {
            return false
        }
    }

    return true}
登入後複製
測試程式碼:

package main import "fmt" func main() {    a := []int{1, 2, 3, 4}    b := []int{1, 3, 2, 4}    c := []int{1, 2, 3, 4}    fmt.Println(testEq(a, b))    fmt.Println(testEq(a, c))}
登入後複製

以上是golang中判斷兩個slice是否相等的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板