Buscar..


Introducción

Las funciones en Go proporcionan un código organizado y reutilizable para realizar un conjunto de acciones. Las funciones simplifican el proceso de codificación, evitan la lógica redundante y hacen que el código sea más fácil de seguir. Este tema describe la declaración y la utilización de funciones, argumentos, parámetros, declaraciones de devolución y ámbitos en Go.

Sintaxis

  • func () // tipo de función sin argumentos y sin valor de retorno
  • func (x int) int // acepta entero y devuelve un entero
  • func (a, b int, z float32) bool // acepta 2 enteros, un float y devuelve un booleano
  • func (prefijo cadena, valores ... int) // función "variadic" que acepta una cadena y uno o más números enteros
  • func () (int, bool) // función que devuelve dos valores
  • func (a, b int, z float64, opt ... interface {}) (success bool) // acepta 2 enteros, uno flotante y uno o más números de interfaces y devuelve un valor booleano (que ya está inicializado dentro de la función) )

Declaración Básica

Una función simple que no acepta ningún parámetro y no devuelve ningún valor:

func SayHello() {
    fmt.Println("Hello!")
}

Parámetros

Una función puede declarar opcionalmente un conjunto de parámetros:

func SayHelloToMe(firstName, lastName string, age int) {
    fmt.Printf("Hello, %s %s!\n", firstName, lastName)
    fmt.Printf("You are %d", age)
}

Observe que el tipo para firstName se omite porque es idéntica a lastName .

Valores de retorno

Una función puede devolver uno o más valores al llamante:

func AddAndMultiply(a, b int) (int, int) {
    return a+b, a*b
}

El segundo valor de retorno también puede ser el error var:

import errors

func Divide(dividend, divisor int) (int, error) {
    if divisor == 0 {
        return 0, errors.New("Division by zero forbidden")
    }
    return dividend / divisor, nil
}

Dos cosas importantes deben ser notadas:

  • Los paréntesis pueden omitirse para un único valor de retorno.
  • Cada declaración de return debe proporcionar un valor para todos los valores de retorno declarados.

Valores de retorno nombrados

Los valores de retorno se pueden asignar a una variable local. Una declaración de return vacía se puede usar para devolver sus valores actuales. Esto se conoce como retorno "desnudo" . Las declaraciones de devoluciones desnudas se deben usar solo en funciones cortas, ya que dañan la legibilidad en funciones más largas:

func Inverse(v float32) (reciprocal float32) {
    if v == 0 {
        return
    }
    reciprocal = 1 / v
    return
}

jugar en el patio de recreo

//A function can also return multiple values
func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

jugar en el patio de recreo

Dos cosas importantes deben ser notadas:

  • Los paréntesis alrededor de los valores de retorno son obligatorios .
  • Siempre se debe proporcionar una declaración de return vacía.

Funciones y cierres literales

Una simple función literal, imprimiendo Hello! al stdout

package main

import "fmt"

func main() {
    func(){
        fmt.Println("Hello!")
    }()
}

jugar en el patio de recreo


Una función literal, imprimiendo el argumento str a stdout:

package main

import "fmt"

func main() {
    func(str string) {
        fmt.Println(str)
    }("Hello!")
}

jugar en el patio de recreo


Una función literal, cerrando sobre la variable str :

package main

import "fmt"

func main() {
    str := "Hello!"
    func() {
        fmt.Println(str)
    }()
}

jugar en el patio de recreo


Es posible asignar una función literal a una variable:

package main

import (
    "fmt"
)

func main() {
    str := "Hello!"
    anon := func() {
        fmt.Println(str)
    }
    anon()
}

jugar en el patio de recreo

Funciones variables

Se puede llamar a una función variad con cualquier número de argumentos finales . Esos elementos se almacenan en una rebanada.

package main

import "fmt"

func variadic(strs ...string) {
     // strs is a slice of string
     for i, str := range strs {
         fmt.Printf("%d: %s\n", i, str)
     }
}

func main() {
     variadic("Hello", "Goodbye")
     variadic("Str1", "Str2", "Str3")
}

jugar en el patio de recreo

También puedes darle una porción a una función variad, con ...

func main() {
     strs := []string {"Str1", "Str2", "Str3"}

     variadic(strs...)
}

jugar en el patio de recreo



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow