Avatar ·

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