bytes.Equal în Go

Equal verifică dacă două slice-uri de octeți au același conținut; Compare le ordonează și dă -1, 0 sau 1.

Sintaxă
func Equal(a, b []byte) bool
func Compare(a, b []byte) int

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 == b pentru două slice-uri: nu compilează. Folosește bytes.Equal.
  • Folosești bytes.Equal pentru a compara parole sau token-uri secrete. Durata comparației depinde de conținut; pentru secrete folosește crypto/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.