Go
Funciones
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
}
//A function can also return multiple values
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
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!")
}()
}
Una función literal, imprimiendo el argumento str
a stdout:
package main
import "fmt"
func main() {
func(str string) {
fmt.Println(str)
}("Hello!")
}
Una función literal, cerrando sobre la variable str
:
package main
import "fmt"
func main() {
str := "Hello!"
func() {
fmt.Println(str)
}()
}
Es posible asignar una función literal a una variable:
package main
import (
"fmt"
)
func main() {
str := "Hello!"
anon := func() {
fmt.Println(str)
}
anon()
}
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")
}
También puedes darle una porción a una función variad, con ...
func main() {
strs := []string {"Str1", "Str2", "Str3"}
variadic(strs...)
}