unicode.IsLetter în Go

Verifică tipul unui caracter: literă, cifră, număr, spațiu alb sau semn de punctuație, după regulile Unicode.

Sintaxă
func IsLetter(r rune) bool
func IsDigit(r rune) bool
func IsNumber(r rune) bool
func IsSpace(r rune) bool
func IsPunct(r rune) bool

Ce face unicode.IsLetter

Funcțiile din pachetul unicode primesc un caracter (rune) și spun din ce categorie face parte. IsLetter: orice literă din orice alfabet (a, ș, Ț, ж, λ). IsDigit: cifrele zecimale (0–9 și cifrele din alte scrieri). IsNumber: orice caracter numeric, inclusiv ², ½ sau cifrele romane Ⅻ. IsSpace: spațiile albe (spațiu, \t, \n, \r, spațiul neîntrerupt U+00A0 și altele). IsPunct: semnele de punctuație (. , ! ? „ ” « » ( ) -).

Spre deosebire de comparații ca r >= 'a' && r <= 'z', aceste funcții funcționează corect cu diacriticele românești și cu orice alfabet. Le vei folosi des împreună cu strings.FieldsFunc, strings.IndexFunc, strings.TrimFunc sau la parcurgerea unui text cu for _, r := range s.

Atenție: simbolurile ca +, =, $, € nu sunt punctuație în Unicode, ci simboluri (unicode.IsSymbol).

Parametri

Parametru Descriere
r Caracterul verificat (rune).

Ce returnează

true dacă caracterul face parte din categorie.

Exemple

Exemplul 1: Statistica unui text

for _, r := range s parcurge textul caracter cu caracter (nu octet cu octet), deci literele ș, ț sunt numărate o singură dată.

package main

import (
	"fmt"
	"unicode"
)

func main() {
	s := "Știi că în 2026, la Iași, sunt 3 festivaluri? Da!"
	litere, cifre, spatii, semne := 0, 0, 0, 0
	for _, r := range s {
		switch {
		case unicode.IsLetter(r):
			litere++
		case unicode.IsDigit(r):
			cifre++
		case unicode.IsSpace(r):
			spatii++
		case unicode.IsPunct(r):
			semne++
		}
	}
	fmt.Println("litere:", litere, "cifre:", cifre, "spații:", spatii, "punctuație:", semne)
}

Rezultat

litere: 31 cifre: 5 spații: 9 punctuație: 4

Exemplul 2: IsDigit față de IsNumber și alte cazuri

package main

import (
	"fmt"
	"unicode"
)

func main() {
	fmt.Println("caracter Letter Digit Number Space Punct")
	for _, r := range []rune{'ș', '7', '²', 'Ⅻ', ' ', '„', '+', 'λ'} {
		fmt.Printf("%-8q %-6t %-5t %-6t %-5t %t\n", r,
			unicode.IsLetter(r), unicode.IsDigit(r), unicode.IsNumber(r), unicode.IsSpace(r), unicode.IsPunct(r))
	}
}

Rezultat

caracter Letter Digit Number Space Punct
'ș'      true   false false  false false
'7'      false  true  true   false false
'²'      false  false true   false false
'Ⅻ'      false  false true   false false
'\u00a0' false  false false  true  false
'„'      false  false false  false true
'+'      false  false false  false false
'λ'      true   false false  false false

Exemplul 3: Validarea unui nume de utilizator

package main

import (
	"fmt"
	"unicode"
)

func numeValid(s string) bool {
	if s == "" {
		return false
	}
	for _, r := range s {
		if !unicode.IsLetter(r) && !unicode.IsDigit(r) && r != '_' {
			return false
		}
	}
	return true
}

func main() {
	for _, n := range []string{"ana_2026", "Ștefan", "ion pop", "maria!"} {
		fmt.Printf("%-10s %t\n", n, numeValid(n))
	}
}

Rezultat

ana_2026   true
Ștefan     true
ion pop    false
maria!     false

Greșeli frecvente

  • Parcurgi textul cu for i := 0; i < len(s); i++ și verifici unicode.IsLetter(rune(s[i])). Așa iei octeți, nu caractere: ș este împărțit în doi octeți fără sens. Folosește for _, r := range s.
  • Folosești IsNumber ca să validezi un număr pentru strconv.Atoi. „²” trece de IsNumber, dar Atoi îl refuză; pentru cifre 0–9 folosește r >= '0' && r <= '9'.

Comenzi înrudite

  • unicode.IsUpper: Verifică dacă un caracter este literă mare (IsUpper) sau literă mică (IsLower).
  • unicode.ToUpper: Transformă un singur caracter în literă mare, mică sau în forma de titlu; celelalte caractere rămân neschimbate.
  • strings.Fields: Împarte textul în cuvinte după spații (oricâte, inclusiv tab și rând nou); FieldsFunc după o condiție a ta.
  • strings.IndexAny: Poziția primului sau ultimului caracter dintr-un set (IndexAny) ori care respectă o condiție (IndexFunc); -1 dacă nu există.
  • strings.TrimFunc: Scoate de la capete caracterele pentru care funcția dată returnează true (la ambele capete, la început sau la sfârșit).