golangスライスは、2つの同じであるか否かを判断します

golangでは、容易に通過することができる==二つのアレイ(配列)が等しいかどうかを決定するために、しかし、2つのスライスは、我々は等しい別のショートカットを見つけることができるかどうかを決定する必要がある場合、残念ながら、関連するオペレータをスライスしませんでした。

等価の定義をスライス

我々は、同じ2つのスライスタイプと長さ、及び目標値の下に等しいとは、例えば、に等しい場合、すなわち、最も一般的な要求を選択しました。

a := []int{1, 2, 3}
b := []int{1, 2, 3}
c := []int{1, 2}
d := []int{1, 3, 2}

上記のコードaとはb、等しいc長さ及びためa異なるが、それが等しくない場合、d要素の順序とがあるためa、異なるように等しくないを行います。

分析2 []バイト等しいです

なぜ我々はそれから[]バイトのリストを分ける必要がありますか?

標準ライブラリは、ICPを最適化し提供するので、我々はもはやホイールを作成する必要がありません。

package main

import (
    "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.DeepEqual2つのオブジェクトを比較するために使用され、それらは内部の要素が等しい含む場合深さを含みます。

func DeepEqual(x, y interface{}) bool

DeepEqualは、xとyは次のように定義された「深く等しい」であるかどうかを報告します。同じ型の2つの値は、次のような場合のいずれかに該当する場合は深く等しいです。別個の型の値は、深く等しいことはありません。
...
以下の全てが真である場合にスライス値が深く等しい:彼らはゼロの両方または非ゼロともに、それらは同じ長さを有し、それらは同じ基本配列(すなわち、同一の初期エントリをポイントいずれか・X [0] ==&Y [0])、またはそれらの対応する要素(長さまで)が深く等しいです。非ゼロ空スライス(例えば、[]バイト{}、[]をバイト(NIL))ゼロスライスが深く等しくないことに留意されたいです。

この一節の意味は、スライス同等の原則をどのように決定するかを、理解することは難しいことではないと、私たちは、この資料の冒頭に述べた、それは「黒魔術」少し、実行時間を意味することを除いて、同じです。

例を見てください:

package main

import (
    "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では、我々は、スライスの種類を決定した場合、その後、比較的等しい判決の独自のスライスを達成することはそれほど面倒ではありません、パフォーマンスのコストは通常​​、かかる反映

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

結果:

もちろん、我々は、我々は異なるバージョンを記述する必要がスライスの多くの種類を持っているように、明らかな欠点を持っていますtestEqが、彼らは唯一のスライスタイプとの唯一の違いです。

しかし、使用することができ、汎用GO2、このような欠陥がなくなってしまうまで待って、そして今、私たちが必要なものを複雑にし、コードの動作性能とのトレードオフをすることです。

参照

2つのスライスの平等をチェックします

おすすめ

転載: www.cnblogs.com/apocelipes/p/11116725.html