Hasta ahora hemos escrito código casi siempre dentro de la función main. Hoy aprenderemos a dividir nuestro código en piezas reutilizables y a entender cómo Go maneja la memoria mediante punteros.
1. Funciones: El corazón de la lógica
Las funciones en Go son sencillas pero tienen una característica que otros lenguajes envidian: pueden devolver múltiples valores.
Estructura básica:
func sumar(a int, b int) int {
return a + b
}
Funciones con múltiples retornos:
Esto es muy usado en Go, especialmente para devolver un resultado y un error al mismo tiempo.
func dividir(a, b float64) (float64, string) {
if b == 0 {
return 0, "No se puede dividir por cero"
}
return a / b, ""
}
// Para usarla:
resultado, mensaje := dividir(10, 2)
2. Punteros: ¿Qué son y para qué sirven?
Un puntero es simplemente una variable que guarda la dirección de memoria de otra variable. En lugar de pasar el «valor» (una copia), pasamos la «ubicación» original.
- & (operador de dirección): Te da la dirección de una variable.
- * (operador de desreferencia): Te permite entrar a esa dirección para ver o cambiar el valor original.
Ejemplo práctico: Valor vs. Puntero
// Esta función recibe una COPIA (el valor original no cambia)
func porValor(i int) {
i = 0
}
// Esta función recibe un PUNTERO (el valor original SÍ cambia)
func porPuntero(i *int) {
*i = 0 // Entramos a la dirección de memoria y cambiamos el dato
}
func main() {
i := 1
porValor(i)
fmt.Println("Después de porValor:", i) // Sigue siendo 1
porPuntero(&i) // Pasamos la dirección de i
fmt.Println("Después de porPuntero:", i) // Ahora es 0
}
3. ¿Cuándo usar cada uno?
Mucha gente se asusta con los punteros, pero la regla en Go es simple:
- Usa valores (Copia): Cuando los datos son pequeños (como un simple int) y no necesitas que la función modifique la variable original.
- Usa punteros (*): * Cuando quieres que una función modifique una variable externa, Cuando el dato es muy grande (como un
structcon mucha información) para evitar la lentitud de copiar todo el dato en memoria.
Resumen técnico:
- Funciones: Usa func, define tipos de entrada y salida. ¡Recuerda que puedes devolver más de una cosa!
- Punteros: No les tengas miedo. Solo sirven para señalar dónde está guardado un dato. & para enviar la dirección, * para usarla.
Reto de la Lección:
Escribe una función llamada intercambiar que reciba dos punteros de números enteros (*int) y cambie sus valores entre sí. Si a=5 y b=10, después de llamar a la función, a debe valer 10 y b debe valer 5.
