Sobes.tech
Middle

¿Cuáles son las peculiaridades al iterar sobre una cadena en Go?

sobes.tech AI

Respuesta de la IA

Al iterar sobre una cadena en Go, es importante tener en cuenta que la cadena representa una secuencia de bytes, no de caracteres Unicode. El paquete unicode/utf8 proporciona funciones para trabajar con secuencias UTF-8 multibyte.

Aspectos clave:

  • Iteración por bytes: El ciclo for i := 0; i < len(s); i++ itera sobre bytes individuales. Si la cadena contiene caracteres multibyte, un carácter puede estar representado por varios bytes.

    // Ejemplo de iteración por bytes
    str := "Привет"
    for i := 0; i < len(str); i++ {
        println(str[i]) // imprime bytes, no caracteres
    }
    
  • Iteración por runas (puntos de código Unicode): Para trabajar correctamente con caracteres Unicode, se debe usar el ciclo for index, ru := range s. Este itera por runas (puntos de código Unicode), manejando secuencias UTF-8 multibyte.

    // Ejemplo de iteración por runas
    str := "Привет"
    for index, ru := range str {
        println(index, ru) // imprime el índice de inicio de la runa y la propia runa (como int32)
    }
    
  • Longitud de la cadena: La función len(s) devuelve la cantidad de bytes, no de runas. Para obtener el número de runas, usa utf8.RuneCountInString(s).

    // Ejemplo de contar bytes y runas
    str := "Привет"
    println("Longitud en bytes:", len(str)) // muestra la cantidad de bytes
    println("Longitud en runas:", utf8.RuneCountInString(str)) // muestra la cantidad de runas
    
  • Acceso por índice: Acceder con s[i] devuelve el i-ésimo byte, no la runa. No se permite acceder directamente a las runas por índice.

    // Ejemplo de acceso a un byte
    str := "Привет"
    println(str[0]) // imprime el primer byte de la cadena, no la primera runa
    
  • Slicing de cadenas: Los slices de cadenas también operan a nivel de bytes. s[i:j] crea un nuevo slice de bytes.

    // Ejemplo de slicing por bytes
    str := "Привет"
    println(str[0:2]) // puede mostrar una secuencia incorrecta si los primeros dos bytes no forman una runa completa
    

Para trabajar de manera confiable con Unicode en Go, se recomienda usar la iteración por runas (range) y funciones del paquete unicode/utf8.