web-dev-qa-db-fra.com

Comparaison de tableaux en langue Go

Comment puis-je comparer correctement deux tableaux dans Go?

Par exemple, comment puis-je comparer des tableaux bidimensionnels avec des entrées int ou tout autre type?

Quelle est la profondeur de cette comparaison?

26
angry_gopher

Pour comparer deux tableaux, utilisez les opérateurs de comparaison== ou !=. Citant le lien:

Les valeurs de tableau sont comparables si les valeurs du type d'élément de tableau sont comparables. Deux valeurs de tableau sont égales si leurs éléments correspondants sont égaux.

Un tableau 2D (ou ND) répondant à l'exigence ci-dessus, vous pouvez le comparer de la même manière.

La question "Quelle est la profondeur de cette comparaison?" n'a pas de sens pour les tableaux.

29
zzzz

Pour une comparaison "profonde", vous pouvez utiliser reflect.DeepEqual .

DeepEqual teste l'égalité profonde. Il utilise l'égalité == normale dans la mesure du possible mais analysera les éléments des tableaux, des tranches, des cartes et des champs de structures. Dans les cartes, les clés sont comparées à == mais les éléments utilisent une égalité profonde. DeepEqual gère correctement les types récursifs. Les fonctions ne sont égales que si elles sont toutes deux nulles. Une tranche vide n'est pas égale à une tranche nulle.

Exemple:

package main

import (
    "bytes"
    "fmt"
    "reflect"
)

func main() {
    a := []byte{}    // empty slice
    b := []byte(nil) // nil slice
    fmt.Printf("%t\n%t", bytes.Equal(a, b), reflect.DeepEqual(a, b))
}

Retour:

vrai
faux

La mise en garde est que c'est lent.

Aire de jeux

18
Intermernet

Si vous avez 2 int tranches/tableaux, essayez ceci:

func IntArrayEquals(a []int, b []int) bool {
    if len(a) != len(b) {
        return false
    }
    for i, v := range a {
        if v != b[i] {
            return false
        }
    }
    return true
}

REMARQUE: c'est pour les tableaux 1D, mais vous pouvez le réécrire pour 2D.

6
Tom