Funciones en Golang

GolangGolangBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

A medida que los proyectos aumentan en complejidad, es común dividir el código en múltiples funciones. Este enfoque mejora la legibilidad del código, facilita la colaboración y te permite reutilizar rápidamente la lógica sin duplicar código. En este laboratorio, aprenderás los conceptos básicos de la creación y el uso de funciones en Go. Verás cómo definir tus propias funciones, entenderás cómo Go maneja los parámetros y los valores de retorno, y aprenderás sobre las funciones init y los parámetros variádicos.

Temas clave:

  • Comprender qué son las funciones y cómo funcionan
  • Declarar funciones en Go
  • Pasar parámetros por valor y por referencia
  • Devolver múltiples valores desde una función
  • Usar la función init para configurar tu entorno
  • Trabajar con parámetros variádicos para un manejo flexible de la entrada

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/BasicsGroup(["Basics"]) go(("Golang")) -.-> go/FunctionsandControlFlowGroup(["Functions and Control Flow"]) go(("Golang")) -.-> go/ErrorHandlingGroup(["Error Handling"]) go/BasicsGroup -.-> go/values("Values") go/BasicsGroup -.-> go/variables("Variables") go/FunctionsandControlFlowGroup -.-> go/for("For") go/FunctionsandControlFlowGroup -.-> go/if_else("If Else") go/FunctionsandControlFlowGroup -.-> go/functions("Functions") go/ErrorHandlingGroup -.-> go/errors("Errors") subgraph Lab Skills go/values -.-> lab-149098{{"Funciones en Golang"}} go/variables -.-> lab-149098{{"Funciones en Golang"}} go/for -.-> lab-149098{{"Funciones en Golang"}} go/if_else -.-> lab-149098{{"Funciones en Golang"}} go/functions -.-> lab-149098{{"Funciones en Golang"}} go/errors -.-> lab-149098{{"Funciones en Golang"}} end

Creación y ejecución de un programa básico

Primero, navega hasta el directorio de tu proyecto y crea un archivo Go:

cd ~/project
touch func.go

Utiliza un editor de texto para abrir func.go y agrega el siguiente código:

package main

import "fmt"

func main() {
    a1, b1 := 12, 4
    a2, b2 := 12, 0

    // Para el primer par
    if b1 == 0 {
        fmt.Println("The divisor cannot be 0")
    } else {
        fmt.Println(a1 / b1)
    }

    // Para el segundo par
    if b2 == 0 {
        fmt.Println("The divisor cannot be 0")
    } else {
        fmt.Println(a2 / b2)
    }
}

Este código intenta realizar dos operaciones de división y comprueba si el divisor es cero antes de la división. Si el divisor es cero, imprime un mensaje de error.

Ejecuta el programa:

go run func.go

Deberías ver:

3
The divisor cannot be 0

Declaración de funciones

En los laboratorios anteriores, independientemente de si el programa era simple o complejo, solo utilizamos la función main para realizar operaciones.

Un programa solo puede tener una función main, que es el punto de entrada del programa. Cuando ejecutamos el programa, otras funciones se llaman y ejecutan directamente o indirectamente dentro de la función main.

Ahora echemos un vistazo a la sintaxis de las funciones:

func functionName(parameters...)(returnValues...){
    code block
}

Aquí, el nombre de la función se utiliza para identificarla. Las siguientes reglas se aplican al nombre de la función:

  • Puede consistir en letras, números y guiones bajos. Sin embargo, la primera letra del nombre de la función no puede ser un número. Por ejemplo, func 3ab(){} no es válido.
  • Cuando la primera letra es mayúscula, puede ser referenciada por código en paquetes externos. Cuando la primera letra es minúscula, solo puede ser utilizada dentro del paquete. Esto es similar a las funciones públicas y privadas.

La lista de parámetros declara la cantidad y el tipo de parámetros que se pasan a la función:

  • La lista de parámetros puede estar vacía o contener múltiples parámetros.

  • Cada parámetro consiste en un nombre de parámetro y un tipo de parámetro. Por ejemplo, en la lista de parámetros siguiente, declaramos dos variables del tipo int.

    func test(a, b int) (res int){}

La lista de valores de retorno se utiliza para devolver los valores necesarios después de que se ejecute la función:

  • La lista de valores de retorno es similar a la lista de parámetros. La cantidad de parámetros puede ser cualquier valor.

  • Generalmente, la lista de retorno consiste en nombres de variables y tipos de variables, y el nombre de la variable es opcional.

  • Si solo se devuelve una variable y solo se declara el tipo de variable, se pueden omitir los paréntesis. Por ejemplo:

    func test(a int, b string) int{}

Cuando los tipos de parámetros son iguales, podemos utilizar el modo de escritura corta. Las dos funciones siguientes tienen la misma funcionalidad:

func test(a, b int, c, d string)(res1, res2 int, res3 string){}

// Short writing mode
func test(a, b int, c, d string)(res1, res2 int, res3 string){}

Reemplaza el contenido de func.go con el siguiente código:

package main

import "fmt"

func check(divisor int) bool {
    if divisor == 0 {
        fmt.Println("The divisor cannot be 0")
        return false
    }
    return true
}

func main() {
    a1, b1 := 12, 4
    a2, b2 := 12, 0

    // Use the check function before division
    if check(b1) {
        fmt.Println(a1 / b1)
    }
    if check(b2) {
        fmt.Println(a2 / b2)
    }
}

Ejecuta el programa nuevamente:

go run func.go

Deberías ver la misma salida:

3
The divisor cannot be 0

Esta vez, la lógica de comprobación está encapsulada en la función check, lo que hace que el código sea más limpio y reutilizable.

Uso de la función init

Go admite una función init que se ejecuta antes de main. Esto se utiliza a menudo para configurar las condiciones del entorno o inicializar variables antes de la ejecución principal.

Reemplace el contenido de func.go con:

package main

import "fmt"

func init() {
    fmt.Println("init statement")
}

func main() {
    fmt.Println("main statement")
}

Ejecute el programa:

go run func.go

Debería ver:

init statement
main statement

En Go, la función init tiene las siguientes características:

  • No tiene parámetros de entrada ni valores de retorno.
  • No puede ser llamada por otras funciones.

Puede haber múltiples funciones init en el mismo archivo de código o en el mismo paquete. El orden de ejecución es el siguiente:

  • La función init que aparece antes en el mismo archivo de código se ejecutará antes.
  • Los archivos que tienen un orden alfabético anterior en el mismo package se ejecutarán antes. Por ejemplo, si el mismo package contiene los siguientes archivos con funciones init:
a1.go
a2.go
b1.go

El orden de ejecución será a1.go, a2.go, b1.go, porque a > b y 1 < 2.

Devolver múltiples valores desde una función

Go permite que las funciones devuelvan múltiples valores. Esto es útil para realizar varios cálculos relacionados a la vez.

Reemplace el contenido de func.go con:

package main

import "fmt"

func cal(a, b int) (int, int, int, int) {
    return a + b, a - b, a * b, a % b
}

func main() {
    add, sub, mul, rem := cal(90, 12)
    fmt.Println(add, sub, mul, rem)
}

Ejecute el programa:

go run func.go

Debería ver:

102 78 1080 6

Aquí, cal devuelve cuatro valores a la vez, lo que ilustra cómo los múltiples valores de retorno pueden simplificar ciertas tareas.

Trabajando con parámetros variádicos

Los parámetros variádicos permiten que una función acepte un número variable de argumentos. Esto puede simplificar los escenarios en los que el tamaño de la entrada no es fijo.

Reemplace el contenido de func.go con:

package main

import "fmt"

func printX(values...string) {
    for _, v := range values {
        fmt.Println(v)
    }
}

func main() {
    printX("labex", "labs", "courses")
}

Ejecute el programa:

go run func.go

Debería ver:

labex
labs
courses

La función printX puede manejar cualquier número de argumentos de tipo cadena, lo que la hace flexible y fácil de usar.

Resumen

En este laboratorio, aprendiste cómo definir y usar funciones en Go, incluyendo cómo devolver múltiples valores y aceptar un número variable de parámetros. También viste cómo la función init se ejecuta antes de main. Al estructurar el código en funciones, puedes hacer que tus programas sean más fáciles de entender, mantener y reutilizar.

Estas habilidades son fundamentales para construir aplicaciones Go modulares y escalables. A medida que tus proyectos crezcan, aprovechar las funciones para organizar el código y la lógica se volverá cada vez más importante.