maps.Equal în Go

Verifică dacă două map-uri au exact aceleași chei cu aceleași valori; EqualFunc compară valorile cu o funcție proprie.

Sintaxă
import "maps"

func Equal[M1, M2 ~map[K]V, K, V comparable](m1 M1, m2 M2) bool
func EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M2, eq func(V1, V2) bool) bool

Ce face maps.Equal

Map-urile nu se pot compara cu == (doar cu nil). maps.Equal(m1, m2) returnează true dacă au aceleași chei și, pentru fiecare cheie, valori egale. Ordinea nu contează (un map nu are ordine). Un map nil și unul gol sunt egale.

maps.EqualFunc(m1, m2, eq) folosește funcția eq pentru valori. Valorile pot avea chiar tipuri diferite, de exemplu compari un map[string]int cu un map[string]string. Este util și pentru numere cu virgulă comparate cu o toleranță.

Parametri

Parametru Descriere
m1, m2 Map-urile comparate.
eq Pentru EqualFunc: spune dacă două valori sunt egale.

Ce returnează

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

Exemple

Exemplul 1: Compararea a două inventare

package main

import (
    "fmt"
    "maps"
)

func main() {
    luni := map[string]int{"mere": 40, "pere": 12}
    marti := map[string]int{"pere": 12, "mere": 40}
    miercuri := map[string]int{"mere": 38, "pere": 12}
    fmt.Println(maps.Equal(luni, marti))
    fmt.Println(maps.Equal(luni, miercuri))

    var gol map[string]int
    fmt.Println(maps.Equal(gol, map[string]int{}))
}

Rezultat

true
false
true

Exemplul 2: Egalitate cu toleranță și între tipuri diferite

package main

import (
    "fmt"
    "maps"
    "math"
    "strconv"
)

func main() {
    calculat := map[string]float64{"Iași": 0.1 + 0.2, "Cluj": 1.0 / 3}
    asteptat := map[string]float64{"Iași": 0.3, "Cluj": 0.3333333333}
    fmt.Println(maps.Equal(calculat, asteptat))
    fmt.Println(maps.EqualFunc(calculat, asteptat, func(a, b float64) bool {
        return math.Abs(a-b) < 1e-9
    }))

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

Rezultat

false
true
true

Greșeli frecvente

  • Scrii m1 == m2: eroare de compilare (map can only be compared to nil).
  • Folosești Equal pe valori float64 rezultate din calcule: diferențe minuscule de rotunjire fac map-urile „diferite”. Folosește EqualFunc cu o toleranță.

Comenzi înrudite

  • slices.Equal: Verifică dacă două slice-uri au aceeași lungime și aceleași elemente, în aceeași ordine; EqualFunc compară cu o funcție proprie.
  • maps.Clone: Clone face o copie a unui map; Copy copiază toate perechile din src în dst, suprascriind cheile existente.