Ce face bytes.Equal
Slice-urile nu pot fi comparate cu == în Go (doar cu nil). bytes.Equal(a, b) spune dacă au aceeași lungime și aceiași octeți. Un slice nil și unul gol sunt considerate egale.
bytes.Compare(a, b) compară octet cu octet, ca strings.Compare, și returnează -1, 0 sau +1. Este forma potrivită pentru sortarea cu slices.SortFunc.
Pachetul bytes are aproape toate funcțiile din strings, dar pentru []byte. Le folosești când datele sunt deja octeți (citite dintr-un fișier sau din rețea), ca să nu le transformi inutil în text.
Parametri
| Parametru | Descriere |
|---|---|
a, b |
Slice-urile comparate. |
Ce returnează
Equal: true/false. Compare: -1, 0 sau +1.
Exemple
Exemplul 1: Compararea conținutului
package main
import (
"bytes"
"fmt"
)
func main() {
a := []byte("Iași")
b := []byte("Iași")
c := []byte("Cluj")
fmt.Println(bytes.Equal(a, b), bytes.Equal(a, c))
fmt.Println(bytes.Equal(nil, []byte{}))
fmt.Println(bytes.Compare(a, c), bytes.Compare(c, a), bytes.Compare(a, b))
}
Rezultat
true false
true
1 -1 0
Exemplul 2: Verificarea antetului unui fișier
Fișierele PNG încep mereu cu aceiași 8 octeți. Comparăm începutul datelor cu acest antet.
package main
import (
"bytes"
"fmt"
)
var antetPNG = []byte{0x89, 'P', 'N', 'G', '\r', '\n', 0x1a, '\n'}
func main() {
date := []byte("\x89PNG\r\n\x1a\n...restul imaginii")
text := []byte("Bună ziua")
fmt.Println("e PNG?", len(date) >= 8 && bytes.Equal(date[:8], antetPNG))
fmt.Println("e PNG?", bytes.HasPrefix(text, antetPNG))
}
Rezultat
e PNG? true
e PNG? false
Greșeli frecvente
- Scrii
a == bpentru două slice-uri: nu compilează. Foloseștebytes.Equal. - Folosești
bytes.Equalpentru a compara parole sau token-uri secrete. Durata comparației depinde de conținut; pentru secrete foloseștecrypto/subtle.ConstantTimeCompare.
Comenzi înrudite
bytes.Contains: Variantele pentru []byte ale funcțiilor strings.Contains, strings.TrimSpace și strings.ToUpper.strings.Compare: Compară două texte octet cu octet și returnează -1, 0 sau 1; util la sortare.bytes.Split: Split împarte un []byte după un separator în mai multe slice-uri; Join le lipește la loc cu un separator.