slices.Equal în Go

Verifică dacă două slice-uri au aceeași lungime și aceleași elemente, în aceeași ordine; EqualFunc compară cu o funcție proprie.

Sintaxă
import "slices"

func Equal[S ~[]E, E comparable](s1, s2 S) bool
func EqualFunc[S1 ~[]E1, S2 ~[]E2, E1, E2 any](s1 S1, s2 S2, eq func(E1, E2) bool) bool

Ce face slices.Equal

În Go nu poți compara două slice-uri cu == (nu compilează; slice-urile se pot compara doar cu nil). slices.Equal(s1, s2) returnează true dacă au aceeași lungime și elementele de pe aceleași poziții sunt egale. Un slice nil și unul gol sunt considerați egali.

slices.EqualFunc(s1, s2, eq) folosește funcția eq pentru fiecare pereche de elemente. Slice-urile pot avea chiar tipuri diferite: de exemplu compari un []int cu un []string.

La float64, NaN nu este egal cu el însuși, deci două slice-uri care conțin NaN nu sunt egale pentru Equal.

Parametri

Parametru Descriere
s1, s2 Slice-urile comparate.
eq Pentru EqualFunc: spune dacă două elemente sunt egale.

Ce returnează

true dacă slice-urile sunt egale, altfel false.

Exemple

Exemplul 1: Compararea a două liste

package main

import (
    "fmt"
    "slices"
)

func main() {
    a := []string{"Ana", "Mihai"}
    b := []string{"Ana", "Mihai"}
    c := []string{"Mihai", "Ana"}
    fmt.Println(slices.Equal(a, b))
    fmt.Println(slices.Equal(a, c))

    var gol []int
    fmt.Println(slices.Equal(gol, []int{}))
}

Rezultat

true
false
true

Exemplul 2: Egalitate fără majuscule și între tipuri diferite

package main

import (
    "fmt"
    "slices"
    "strconv"
    "strings"
)

func main() {
    a := []string{"IAȘI", "Cluj"}
    b := []string{"iași", "CLUJ"}
    fmt.Println(slices.EqualFunc(a, b, strings.EqualFold))

    numere := []int{1, 2, 3}
    texte := []string{"1", "2", "3"}
    fmt.Println(slices.EqualFunc(numere, texte, func(n int, t string) bool {
        return strconv.Itoa(n) == t
    }))
}

Rezultat

true
true

Greșeli frecvente

  • Scrii a == b pentru două slice-uri: eroare de compilare (slice can only be compared to nil).
  • Aștepți ca Equal să ignore ordinea: [Ana Mihai] și [Mihai Ana] sunt diferite. Sortează copii ale lor înainte, dacă ordinea nu contează.

Comenzi înrudite

  • slices.Compare: Compară două slice-uri element cu element (ca în dicționar) și returnează -1, 0 sau +1.
  • maps.Equal: Verifică dacă două map-uri au exact aceleași chei cu aceleași valori; EqualFunc compară valorile cu o funcție proprie.
  • slices.Sort: Sortează crescător, pe loc, un slice de orice tip ordonat (numere, texte).