Lecciones del módulo (4/5)
Strings, bytes y runas
En Go, un string es una secuencia inmutable de bytes. Literales de cadena
están codificados en UTF-8. Un rune es un alias para int32 y
representa un único punto de código Unicode.
Comprender la diferencia entre bytes y runas es esencial para evitar errores cuando una cadena contiene acentos, emojis, ideogramas o cualquier Carácter no ASCII.
string = bytes, no caracteres
s := "ciaò"
fmt.Println(len(s)) // 5 — not 4!
fmt.Println(s[0]) // 99 ('c' as a byte)
fmt.Println(s[3]) // 195 (first byte of 'ò' in UTF-8)len(s) devuelve el número de bytes, caracteres no visibles.
La indexación de s[i] devuelve el i-ésimo byte (uint8), no el carácter.
for range itera runas
for i, r := range s decodifica UTF-8 sobre la marcha: i es el desplazamiento de bytes
del inicio de la runa, r es la runa (int32):
s := "ciaò"
for i, r := range s {
fmt.Printf("%d %c (U+%04X)\n", i, r, r)
}
// 0 c (U+0063)
// 1 i (U+0069)
// 2 a (U+0061)
// 3 ò (U+00F2) <- starts at byte 3, takes 2 bytes[]rune(s): indexación por carácter
Conversión explícita: asigna una nueva porción de runas. Costoso pero a veces es necesario:
runes := []rune("ciaò")
fmt.Println(len(runes)) // 4
fmt.Println(string(runes[3])) // òstring(runes) es la conversión inversa: toma un []rune y produce
una cadena UTF-8.
Las cadenas son inmutables
s := "ciao"
// s[0] = 'C' // ERROR: cannot assign to s[0]Para mutar, convertir a []byte o []rune, operar, volver a convertir:
b := []byte(s)
b[0] = 'C'
s = string(b) // "Ciao"Concatenación
El operador + funciona, pero para muchas concatenaciones en un bucle se utiliza
strings.Builder (más eficiente, evita asignaciones intermedias):
var sb strings.Builder
for i := 0; i < 5; i++ {
sb.WriteString("ab")
}
fmt.Println(sb.String()) // "ababababab"Paquetes útiles
- CÓDIGOPH0: CÓDIGOF1, CÓDIGOF2, CÓDIGOF3, CÓDIGOF4, CÓDIGOF5, CÓDIGOF6...
- CÓDIGOPH7: CÓDIGOPH8, CÓDIGOPH9, CÓDIGOPH10, CÓDIGOPH11...
- CÓDIGOPH12: CÓDIGOPH13, CÓDIGOPH14, CÓDIGOPH15...
Contains6:Contains7 (alternativa aContains8).
Pruébalo
Itere la cadena s con rango e imprima el índice y la runa usando %d %c.
Mostrar pista
el rango sobre una cadena devuelve byte-offset + runa.
Solución disponible después de 3 intentos
Convierta s a []rune e imprima su longitud en caracteres.
Mostrar pista
Conversión explícita: `[]rune(s)`.
Solución disponible después de 3 intentos
¿Qué es len("ciaò")?
s := "ciaò"
fmt.Println(len(s))Resumen
string= secuencia inmutable de bytes, codificada en UTF-8.- CÓDIGOPH1 = bytes;
s[i]= el i-ésimo byte (uint8). for i, r := range sdecodifica runas;ies el desplazamiento de bytes.[]rune(s)para indexar por carácter (costoso, asigna).- Para mutar: pasar por
[]byteo[]rune. - Para concatenar en bucle:
strings.Builder. - Paquetes clave:
strings,len(s)0,len(s)1,len(s)2.