golang で 2 つのスライスが等しいかどうかを判断する

藏色散人
リリース: 2021-04-02 15:13:09
転載
2288 人が閲覧しました

次の golang のチュートリアル コラムでは、golang で 2 つのスライスが等しいかどうか、および値の下の配列が等しいかどうかを判断する方法を紹介します。それを必要としている友達の役に立つでしょう。助けてください!

golang で 2 つのスライスが等しいかどうかを判断する

golang では、== によって 2 つの配列が等しいかどうかを簡単に判断できますが、残念ながらスライスは関連する演算子ではありません。 2 つのスライスが等しい場合、別のショートカットを見つけるしかありません。

スライスの等価性の定義

最も一般的な要件、つまり 2 つのスライスのタイプと長さが同じであり、その値が同じである場合を選択します。等しい添字も等しいです。例:

a := []int{1, 2, 3}b := []int{1, 2, 3}c := []int{1, 2}d := []int{1, 3, 2}
ログイン後にコピー

上記のコードでは、ab は等しくなりますが、c は長さが異なるため等しくありません。 a,d とは要素の順序が a と異なるため等しくありません。

2 つの [] バイトが等しいかどうかを判断する

なぜ [] バイトを別々にリストする必要があるのでしょうか?

標準ライブラリは最適化された比較スキームを提供するため、車輪を再発明する必要はなくなりました。

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))}
ログイン後にコピー

リフレクトを使用してスライス (配列) が等しいかどうかを判断します

タイプが []byte ではないスライスを判断する場合、reflect.DeepEqual を使用することもできます。これは、2 つのオブジェクト (その中に含まれる要素も含む) が等しいかどうかを詳細に比較するために使用されます。

func DeepEqual(x, y interface{}) bool
ログイン後にコピー

DeepEqual は、x と y が次のように定義される「完全に等しい」かどうかを報告します。次のいずれかの場合に該当する場合、同一型の 2 つの値は完全に等しいと見なされます。深く等しいことはありません。同じ基礎となる配列の最初のエントリ (つまり、&x[0] == &y[0]) またはそれらの対応する要素 (長さまで) は完全に等しいことに注意してください。非 nil の空のスライスと nil スライス (たとえば、 , []byte{} と []byte( nil)) は完全に等価ではありません。

この文章の意味を理解するのは難しくありません。決定方法の原理と同じです。この記事の冒頭で説明したスライスの等価性ですが、ランタイムに少し「暗い魔法」を使用する点が異なります。

例を見てください:

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 でリフレクトを使用すると、通常、パフォーマンスのコストがかかります。スライスの等価性判定を自分で実装するのはそれほど面倒ではありません:

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 で 2 つのスライスが等しいかどうかを判断するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:learnku.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート