Ce face cmp.Compare
cmp.Compare(x, y) compară două valori de un tip ordonat (numere, texte) și returnează -1 dacă x < y, 0 dacă sunt egale și +1 dacă x > y. Este exact forma cerută de slices.SortFunc, slices.BinarySearchFunc sau slices.MaxFunc.
cmp.Less(x, y) returnează true dacă x este mai mic decât y.
Diferența față de operatorii < și == apare la NaN: pentru cmp, NaN este mai mic decât orice alt număr și egal cu el însuși. Astfel sortarea rămâne corectă chiar dacă datele conțin NaN. Interfața cmp.Ordered descrie tipurile acceptate.
Parametri
| Parametru | Descriere |
|---|---|
x, y |
Valorile comparate, de același tip ordonat. |
Ce returnează
Compare: -1, 0 sau +1. Less: un bool.
Exemple
Exemplul 1: Rezultatele lui Compare și Less
package main
import (
"cmp"
"fmt"
"math"
)
func main() {
fmt.Println(cmp.Compare(3, 7), cmp.Compare(7, 7), cmp.Compare(9, 7))
fmt.Println(cmp.Compare("Arad", "Iași"))
fmt.Println(cmp.Less(2.5, 3.0))
nan := math.NaN()
fmt.Println(nan < 1, cmp.Less(nan, 1))
fmt.Println(nan == nan, cmp.Compare(nan, nan))
}
Rezultat
-1 0 1
-1
true
false true
false 0
Exemplul 2: Funcție de comparare pentru sortare
package main
import (
"cmp"
"fmt"
"slices"
)
type Oras struct {
Nume string
Altitudine int
}
func main() {
orase := []Oras{{"Brașov", 625}, {"Iași", 95}, {"Sinaia", 798}, {"Constanța", 25}}
slices.SortFunc(orase, func(a, b Oras) int { return cmp.Compare(a.Altitudine, b.Altitudine) })
fmt.Println(orase)
}
Rezultat
[{Constanța 25} {Iași 95} {Brașov 625} {Sinaia 798}]
Greșeli frecvente
- Scrii comparatorul ca
a.X - b.X: pentru întregi mari scăderea poate depăși limita, iar pentrufloat64nu compilează.cmp.Compareeste sigur.
Comenzi înrudite
cmp.Or: Returnează primul argument diferit de valoarea zero a tipului („”, 0, nil); dacă toate sunt zero, returnează zero.slices.SortFunc: Sortează un slice după o funcție de comparare care returnează negativ, zero sau pozitiv; SortStableFunc păstrează ordinea celor egali.slices.Max: Returnează cel mai mare (Max) sau cel mai mic (Min) element dintr-un slice; variantele Func folosesc o comparație proprie.math.Inf: Valorile speciale ale lui float64: infinit (Inf, IsInf) și „nu este un număr” (NaN, IsNaN).