Sobes.tech
Middle

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, use utf8.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.