cmp.Compare în Go

Compare returnează -1, 0 sau +1 după cum x este mai mic, egal sau mai mare decât y; Less spune dacă x < y.

Sintaxă
import "cmp"

func Compare[T Ordered](x, y T) int
func Less[T Ordered](x, y T) bool

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 pentru float64 nu compilează. cmp.Compare este 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).