Dominar el recorrido de slices con range en Go es fundamental para trabajar con colecciones de datos. Además, construir una función que detecte palíndromos es un ejercicio clásico que pone en práctica ciclos, manejo de strings y conversión de tipos. Aquí se exploran ambos temas paso a paso.
¿Cómo se recorre un slice con range en Go?
Para iterar sobre los elementos de un slice, Go ofrece la palabra reservada range dentro de un ciclo for. Al utilizarla, se obtienen dos variables: el índice y el valor de cada elemento [0:18].
go
slice := []string{"Hola", "qué", "hace"}
for i, v := range slice {
fmt.Println(i, v)
}
Al ejecutar, los índices 0, 1, 2 se imprimen junto con cada string del slice.
¿Qué pasa si no necesitas el índice o el valor?
Si el índice no es relevante, se descarta con el guion bajo (_), tal como se hace con funciones que retornan más de un valor [0:50].
go
for _, v := range slice {
fmt.Println(v)
}
Por el contrario, si solo interesa el índice, basta con declarar una única variable. Go descartará automáticamente el valor [1:05].
go
for i := range slice {
fmt.Println(i)
}
¿Cómo construir una función palíndromo en Go?
Un palíndromo es una palabra o frase que se lee igual de izquierda a derecha que de derecha a izquierda. Ejemplos clásicos: "ama" y "amor a Roma" [1:30].
La estrategia consiste en invertir el texto recibido y compararlo con el original.
¿Cómo invertir un string con un ciclo for inverso?
Se declara una variable textReverse de tipo string que almacenará la palabra en sentido contrario. Luego, se construye un for que arranca desde el último índice y va restando una unidad en cada iteración [2:00].
go
func isPalindromo(text string) {
var textReverse string
for i := len(text) - 1; i >= 0; i-- {
textReverse += string(text[i])
}
if text == textReverse {
fmt.Println("Es palíndromo")
} else {
fmt.Println("No es palíndromo")
}
}
- Se usa
len(text) - 1 para respetar el índice base cero.
- El operador
+= concatena cada carácter al resultado invertido.
- La conversión con
string(text[i]) es necesaria porque acceder a un índice de un string en Go devuelve su valor en código ASCII, no el carácter como texto [2:40].
El código ASCII es una tabla numérica que asigna un número entero a cada carácter. Por eso, al acceder a text[i], se obtiene un número que debe convertirse explícitamente a string para concatenarlo correctamente.
¿Por qué falla con mayúsculas y cómo resolverlo?
Al probar con "Ama" (primera letra en mayúscula), la función indica que no es palíndromo [3:45]. La razón es que en la tabla ASCII, una letra mayúscula tiene un valor numérico diferente al de su versión minúscula. La A (65) no es igual a la a (97).
El reto propuesto consiste en normalizar el texto antes de compararlo. El paquete strings de la biblioteca estándar de Go incluye funciones como strings.ToLower() que convierten todo el texto a minúsculas, eliminando así la diferencia entre mayúsculas y minúsculas [4:30].
go
import "strings"
func isPalindromo(text string) {
text = strings.ToLower(text)
// resto de la lógica...
}
¿Qué habilidades se practican con este ejercicio?
Este ejercicio refuerza varias competencias clave en Go:
- Iteración con range: obtener índice, valor o ambos según la necesidad.
- Ciclos inversos: recorrer estructuras de datos en sentido contrario.
- Conversión de tipos: transformar valores ASCII a string con
string().
- Comparación de strings: validar igualdad entre cadenas de texto.
- Uso de paquetes estándar: explorar
strings para funciones de manipulación de texto como convertir a minúsculas o mayúsculas.
Consultar la documentación oficial de Go y revisar el paquete strings es una práctica recomendada para conocer todas las herramientas disponibles para el manejo de texto. ¿Ya resolviste el reto de las mayúsculas? Comparte tu solución en los comentarios.