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 verificiunicode.IsLetter(rune(s[i])). Așa iei octeți, nu caractere: ș este împărțit în doi octeți fără sens. Foloseștefor _, r := range s. - Folosești
IsNumberca să validezi un număr pentrustrconv.Atoi. „²” trece de IsNumber, dar Atoi îl refuză; pentru cifre 0–9 foloseșter >= '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).