Saltar al contenido principal
eLearner.app
Módulo 4 · Lección 4 de 519/50 en el curso~12 min
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

Go
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):

Go
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:

Go
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

Go
s := "ciao"
// s[0] = 'C'   // ERROR: cannot assign to s[0]

Para mutar, convertir a []byte o []rune, operar, volver a convertir:

Go
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):

Go
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 a Contains8).

Pruébalo

Ejercicio#go.m4.l4.e1
Intentos: 0Cargando...

Itere la cadena s con rango e imprima el índice y la runa usando %d %c.

Cargando editor...
Mostrar pista

el rango sobre una cadena devuelve byte-offset + runa.

Solución disponible después de 3 intentos

Ejercicio#go.m4.l4.e2
Intentos: 0Cargando...

Convierta s a []rune e imprima su longitud en caracteres.

Cargando editor...
Mostrar pista

Conversión explícita: `[]rune(s)`.

Solución disponible después de 3 intentos

Cuestionario#go.m4.l4.e3
Listo

¿Qué es len("ciaò")?

Go
s := "ciaò"
fmt.Println(len(s))
Opciones de respuesta

Resumen

  • string = secuencia inmutable de bytes, codificada en UTF-8.
  • CÓDIGOPH1 = bytes; s[i] = el i-ésimo byte (uint8).
  • for i, r := range s decodifica runas; i es el desplazamiento de bytes.
  • []rune(s) para indexar por carácter (costoso, asigna).
  • Para mutar: pasar por []byte o []rune.
  • Para concatenar en bucle: strings.Builder.
  • Paquetes clave: strings, len(s)0, len(s)1, len(s)2.