Contenido del curso

Estructuras de Datos y Funciones

Runas en Go: bytes vs caracteres reales

Resumen

En Go cada carácter de una cadena no se llama carácter sino runa, y entender esta diferencia te ayuda a optimizar memoria y a manejar textos con caracteres especiales como Unicode UTF-8. Si vienes de otros lenguajes donde una letra equivale a un byte, aquí vas a descubrir por qué Go cuenta distinto y cómo aprovecharlo.

¿Qué es una runa en Go y por qué importa?

Una runa en Go es la unidad real con la que el lenguaje representa cada carácter de una cadena. El nombre viene justo de las runas vikingas, y aunque suene exótico, responde a una decisión técnica muy concreta: permitir que Go maneje caracteres especiales sin desperdiciar espacio en memoria.

Cuando trabajas con letras normales bajo el estándar Unicode, cada carácter consume cierto espacio. Las runas optimizan ese consumo, y ahí se nota la obsesión de Go por mejorar el rendimiento incluso en los detalles más pequeños [1:05].

¿Una runa es lo mismo que un carácter? No. En Go una runa es la representación interna de un punto Unicode, y un solo carácter visible puede ocupar varias runas dependiendo del idioma o símbolo.

¿Cómo se comporta una cadena con caracteres Unicode UTF 8?

Para verlo en acción, basta con crear una carpeta runas con un archivo main.go e importar el paquete unicode/utf8, que es la forma estándar en la que Go procesa los textos de cualquier cadena.

Si defines una constante con la palabra hola escrita en tailandés y mides su longitud con len(), el resultado es 18. Eso ocurre porque los caracteres no son alfanuméricos y se procesan distinto en memoria [3:10].

En cambio, si defines otra constante con la palabra hola en español, la longitud es 4. Misma palabra, mismo significado, pero un abismo en cómo Go las almacena.

go const saludo = "สวัสดี" const saludo2 = "Hola"

fmt.Println("Longitud saludo:", len(saludo)) // 18 fmt.Println("Longitud saludo2:", len(saludo2)) // 4

¿Cómo cuento las runas reales de una cadena?

La función len() te devuelve bytes, no runas. Para contar runas reales necesitas el paquete unicode/utf8 y su función RuneCountInString, que recorre la cadena respetando los puntos Unicode.

¿Por qué len() y RuneCountInString dan resultados distintos? Porque len() cuenta bytes en memoria y RuneCountInString cuenta caracteres Unicode. En textos en español suelen coincidir, pero en idiomas como tailandés, japonés o emojis no.

Para recorrer cada runa y ver dónde empieza en memoria, puedes usar un ciclo for con range, que te entrega dos valores: el índice en bytes y el valor de la runa.

go for i, r := range saludo { fmt.Printf("Índice %d: runa %U carácter %c\n", i, r, r) }

Al ejecutar go run main.go, la consola muestra el código Unicode de cada runa, su carácter visible y la posición exacta donde inicia en memoria [5:40]. Esa salida es la prueba visual de que Go no ve cuatro letras: ve una secuencia de bytes mapeados a runas.

¿Por qué aprender runas te hace mejor desarrollador en Go?

Llegar al nivel de detalle de las runas implica un conocimiento más avanzado del lenguaje, y demuestra que te interesa entender cómo Go maneja los recursos por dentro.

Estos son los aprendizajes que te llevas al dominar este tema:

  • Diferenciar bytes de runas para evitar errores al medir longitudes.
  • Procesar correctamente textos en cualquier idioma con Unicode UTF 8.
  • Optimizar memoria al elegir entre string, []byte y []rune según el caso.
  • Recorrer cadenas con range sabiendo qué te devuelve cada iteración.

Como recurso adicional, existe un artículo publicado en octubre de 2013 en el blog oficial de Go que explica a profundidad el manejo de memoria entre caracteres y runas [7:20]. Vale la pena leerlo si quieres profundizar.

Gracias a esto no solo conoces más de Go, también entiendes mejor cómo se maneja el cómputo en los sistemas que construyes. Y más importante: aprendes a mejorar el manejo de memoria para seguir presumiendo que tus aplicaciones de Go son las más rápidas. ¿Habías notado antes esta diferencia entre len() y el conteo real de caracteres? Cuéntame en los comentarios.