strings.Compare în Go

Compară două texte octet cu octet și returnează -1, 0 sau 1; util la sortare.

Sintaxă
func Compare(a, b string) int

Ce face strings.Compare

strings.Compare(a, b) returnează 0 dacă a == b, -1 dacă a vine înaintea lui b și +1 dacă vine după. Este forma potrivită pentru funcțiile de comparare cerute de slices.SortFunc.

Comparația se face octet cu octet (după codurile UTF-8), nu după ordinea alfabetică românească. Literele mari vin înaintea celor mici ("Z" < "a"), iar literele cu diacritice vin după toate literele fără diacritice: „Ștefan” este după „Zoe”.

Pentru egalitate și pentru <, > poți folosi direct operatorii pe texte; dau același rezultat și sunt mai ușor de citit.

Parametri

Parametru Descriere
a, b Textele comparate.

Ce returnează

-1, 0 sau +1.

Exemple

Exemplul 1: Rezultatele posibile

package main

import (
	"fmt"
	"strings"
)

func main() {
	fmt.Println(strings.Compare("Ana", "Ana"))
	fmt.Println(strings.Compare("Ana", "Ion"))
	fmt.Println(strings.Compare("Ion", "Ana"))
	fmt.Println(strings.Compare("Zoe", "ana"))
	fmt.Println(strings.Compare("Ștefan", "Zoe"))
}

Rezultat

0
-1
1
-1
1

Exemplul 2: Sortare cu slices.SortFunc

Ordinea este după octeți: „Ștefan” ajunge ultimul. Pentru ordinea din dicționarul românesc ai nevoie de pachetul extern golang.org/x/text/collate.

package main

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

func main() {
	nume := []string{"Maria", "Ștefan", "Ana", "Zoe", "Ion"}
	slices.SortFunc(nume, strings.Compare)
	fmt.Println(nume)
	slices.SortFunc(nume, func(a, b string) int { return strings.Compare(b, a) })
	fmt.Println("invers:", nume)
}

Rezultat

[Ana Ion Maria Zoe Ștefan]
invers: [Ștefan Zoe Maria Ion Ana]

Greșeli frecvente

  • Crezi că sortarea cu Compare este alfabetică pentru limba română. Diacriticele ajung la sfârșit; folosește golang.org/x/text/collate pentru ordinea corectă.
  • Sortezi nume scrise cu litere mari și mici amestecate: „Zoe” ajunge înaintea lui „ana”, pentru că toate majusculele vin înaintea literelor mici. Compară versiunile cu litere mici sau folosește o funcție care ignoră diferența.

Comenzi înrudite

  • strings.EqualFold: Compară două texte fără să țină cont de litere mari și mici, corect și pentru diacritice.
  • bytes.Equal: Equal verifică dacă două slice-uri de octeți au același conținut; Compare le ordonează și dă -1, 0 sau 1.