Quais são as nuances ao iterar sobre uma string em Go?
sobes.tech IA
Resposta da IA
Ao iterar sobre uma string em Go, é importante ter em mente que a string representa uma sequência de bytes, não de caracteres Unicode. O pacote unicode/utf8 fornece funções para trabalhar com sequências UTF-8 multibyte.
Principais pontos:
-
Iteração por bytes: O ciclo
for i := 0; i < len(s); i++itera sobre bytes individuais. Se a string contiver caracteres multibyte, um caractere pode ser representado por vários bytes.// Exemplo de iteração por bytes str := "Привет" for i := 0; i < len(str); i++ { println(str[i]) // imprime bytes, não caracteres } -
Iteração por runas (pontos de código Unicode): Para trabalhar corretamente com caracteres Unicode, use o ciclo
for index, ru := range s. Ele itera por runas (pontos de código Unicode), lidando com sequências UTF-8 multibyte.// Exemplo de iteração por runas str := "Привет" for index, ru := range str { println(index, ru) // imprime o índice de início da runa e a própria runa (como int32) } -
Comprimento da string: A função
len(s)retorna o número de bytes, não de runas. Para obter o número de runas, useutf8.RuneCountInString(s).// Exemplo de contagem de bytes e runas str := "Привет" println("Comprimento em bytes:", len(str)) // mostra o número de bytes println("Comprimento em runas:", utf8.RuneCountInString(str)) // mostra o número de runas -
Acesso por índice: O acesso
s[i]retorna o i-ésimo byte, não a runa. O acesso direto às runas por índice não é suportado.// Exemplo de acesso a um byte str := "Привет" println(str[0]) // imprime o primeiro byte da string, não a primeira runa -
Fatias de strings: As fatias de strings também operam ao nível de bytes.
s[i:j]cria uma nova fatia de bytes.// Exemplo de fatia de string por bytes str := "Привет" println(str[0:2]) // pode exibir uma sequência incorreta se os dois primeiros bytes não formarem uma runa completa
Para trabalhar de forma confiável com Unicode em Go, recomenda-se usar a iteração por runas (range) e funções do pacote unicode/utf8.