Como obter o número de caracteres (runas) em uma string em Go, e não bytes?
Por que len() conta bytes, não caracteres?
Em Go, strings são sequências imutáveis de bytes. A função len() retorna o número de bytes, não de caracteres. Caracteres Unicode como letras russas ou emojis podem ocupar múltiplos bytes (geralmente 2 bytes para cirílico).
Solução: use utf8.RuneCountInString()
Para contar caracteres (runas) em uma string Unicode, utilize o pacote unicode/utf8:
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
password := "пароль"
if utf8.RuneCountInString(password) < 8 {
fmt.Println("Senha muito curta")
}
}
Isso imprimirá "Senha muito curta" apenas se a senha tiver menos de 8 caracteres, considerando corretamente caracteres multibyte.
Alternativa com range
Você também pode iterar sobre runas usando range:
package main
import "fmt"
func main() {
password := "пароль"
count := 0
for range password {
count++
}
fmt.Println(count) // 6
}
Considerações sobre validação de senha
Sim, você precisa considerar Unicode! Senhas podem conter caracteres de qualquer idioma. O uso de utf8.RuneCountInString() ou iteração com range funciona corretamente com cirílico, emojis e outros caracteres Unicode.
Para uma solução mais robusta, você também pode usar len([]rune(password)):
password := "пароль😊"
fmt.Println(len([]rune(password))) // 7 (6 letras + 1 emoji)
Tags: strings, runas, comprimento de string, unicode, go