Pasando funciones en Go: de principiante a profesional en 15 minutos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Se puede pasar una función como parámetro? Sí, y he aquí por qué lo cambia todo

\n\n

¿Alguna vez te has preguntado si en Go se puede pasar una función dentro de otra, como una variable normal? Si vienes del mundo de Python o JavaScript, este es un patrón familiar para ti. Pero en Go, a pesar de toda su rigurosidad, las funciones como parámetros no solo son "posibles", sino que son una de las herramientas más poderosas del lenguaje.

\n\n

Recuerdo mi primer encuentro con este concepto: estaba escribiendo una utilidad para procesar registros y me di cuenta de que estaba copiando y pegando el mismo bucle con diferente lógica interna. La solución llegó cuando comprendí que simplemente podía pasar la función necesaria como argumento. El código se volvió más limpio, más corto y más claro. En este artículo, te mostraré cómo dominar el paso de una función a otra función en Go, desde ejemplos simples hasta patrones reales que podrás usar mañana en el trabajo.

\n\n

Por cierto, en PythonLib vemos a menudo preguntas como "Can functions be passed as parameters?" en Stack Overflow con miles de visitas. Aclaremos este tema de una vez por todas con el ejemplo de Go.

\n\n

¿Qué son las funciones como parámetros en Go?

\n\n

En Go, las funciones son objetos de primera clase. Esto significa que se pueden:

\n
    \n
  • Asignar a variables
  • \n
  • Pasar a otras funciones
  • \n
  • Devolver desde funciones
  • \n
  • Almacenar en estructuras y slices
  • \n
\n\n

Cuando hablamos de función como parámetro, nos referimos a que una función recibe otra función como argumento y la llama internamente. ¿Suena complicado? En realidad es más fácil de lo que parece.

\n\n

Sintaxis: cómo declarar una función que recibe otra función

\n\n

En Go, debes especificar explícitamente el tipo de la función parámetro. Se ve así:

\n\n
// Declaramos un tipo de función\ntype Transformer func(string) string\n\n// Función que recibe otra función\nfunc processText(text string, transform Transformer) string {\n    return transform(text)\n}
\n\n

O puedes declarar el tipo directamente en la firma:

\n\n
func processText(text string, transform func(string) string) string {\n    return transform(text)\n}
\n\n

Ambas opciones funcionan. La primera es más conveniente si planeas reutilizar el tipo. La segunda, para soluciones rápidas.

\n\n

Ejemplo simple: pasamos una función de saludo

\n\n

Escribamos algo práctico. Imagina que tienes una función que formatea el nombre de un usuario y quieres usar diferentes saludos:

\n\n
package main\n\nimport "fmt"\n\n// Tipo para la función de saludo\ntype Greeter func(name string) string\n\n// Función que recibe el saludo\nfunc greetUser(name string, greeter Greeter) {\n    message := greeter(name)\n    fmt.Println(message)\n}\n\nfunc main() {\n    // Saludo normal\n    normalGreet := func(name string) string {\n        return "¡Hola, " + name + "!"\n    }\n\n    // Saludo formal\n    formalGreet := func(name string) string {\n        return "Estimado(a) " + name + ", buenos días."\n    }\n\n    greetUser("Ana", normalGreet)\n    greetUser("Ana", formalGreet)\n}
\n\n

Salida:

\n
¡Hola, Ana!\nEstimado(a) Ana, buenos días.
\n\n

¿Ves? Simplemente pasamos diferentes funciones al mismo greetUser. Esto es el paso de una función como argumento en acción.

\n\n

Funciones Callback: cuando necesitas procesar un resultado

\n\n

Uno de los escenarios más comunes para usar funciones como parámetros son los callbacks. Realizas alguna operación y llamas a la función pasada cuando la operación se completa.

\n\n
package main\n\nimport (\n    "fmt"\n    "time"\n)\n\n// Función que simula una carga larga de datos\nfunc fetchData(callback func(string)) {\n    fmt.Println("Cargando datos...")\n    time.Sleep(2 * time.Second) // Simulación de retardo\n    data := "Datos importantes de la base de datos"\n    callback(data)                

Blogs

Book Recommendations