Contenido del curso
Fundamentos de Go
Estructuras de Datos y Funciones
- 8

Sentencia switch en Go con ejemplos reales
07:16 min - 9

Arreglos en Go: fijos e inferidos
06:55 min - 10

Creación y uso de slices dinámicos en Go
08:25 min - 11

Mapas en Go: creación, acceso y manipulación de datos clave-valor
09:37 min - 12

Cómo crear y usar funciones personalizadas en Go
07:09 min - 13

Retorno de múltiples valores en Go
07:43 min - 14

Funciones variadic en Go con tres puntos
07:10 min - 15

Funciones recursivas en Go con Fibonacci
06:11 min - 16

Punteros en Go para optimizar rendimiento del sistema
05:19 min - 17

Runas en Go: bytes vs caracteres reales
Viendo ahora - 18

Declaración y uso de estructuras de datos en Go
09:06 min - 19

Implementación de enumeradores en Go para controlar estados
09:32 min
Manejo de Errores y Concurrencia
Buenas Prácticas en Go
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 yRuneCountInStringcuenta 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,[]bytey[]runesegún el caso. - Recorrer cadenas con
rangesabiendo 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.