¿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, usautf8.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.