Seguimos con funciones en Go.
Se puede pasar la dirección de una variable como parámetro de una función con esta técnica, podemos modificar el valor este parámetro. A la vez, esto permite que golang no tenga la necesidad de copiar este parámetro. Cosa muy útil cuando tenemos que pasar estructuras grandes o vectores.
package main
import "fmt"
func update(a *int, t *string) {
*a = *a + 5 // defrencing pointer address
*t = *t + " Doe" // defrencing pointer address
return
}
func main() {
var age = 20
var text = "John"
fmt.Println("Before:", text, age)
update(&age, &text)
fmt.Println("After :", text, age)
}
Una función anónima es una función que se declaró sin ningún identificador con nombre para hacer referencia a ella. Las funciones anónimas pueden aceptar entradas y devolver salidas, tal como lo hacen las funciones estándar.
package main
import "fmt"
func main() {
func(l int, b int) {
fmt.Println(l * b)
}(20, 30)
}
Las clausuras son un caso especial de funciones anónimas., son funciones anónimas que acceden a las variables definidas fuera del cuerpo de la función.
package main
import "fmt"
func main() {
for i := 10.0; i < 100; i += 10.0 {
rad := func() float64 {
return i * 39.370
}()
fmt.Printf("%.2f Meter = %.2f Inch\n", i, rad)
}
}
Una función de orden superior es una función que recibe una función como argumento o devuelve la función como salida.
Las funciones de orden superior son funciones que operan sobre otras funciones, ya sea tomándolas como argumentos o devolviéndolas.
package main
import "fmt"
func sum(x, y int) int {
return x + y
}
func partialSum(x int) func(int) int {
return func(y int) int {
return sum(x, y)
}
}
func main() {
partial := partialSum(3)
fmt.Println(partial(7))
}
En el programa anterior, la función de suma parcial devuelve una función de suma que toma dos argumentos int y devuelve un argumento int.
package main
import "fmt"
func squareSum(x int) func(int) func(int) int {
return func(y int) func(int) int {
return func(z int) int {
return x*x + y*y + z*z
}
}
}
func main() {
// 5*5 + 6*6 + 7*7
fmt.Println(squareSum(5)(6)(7))
}
En el programa anterior, la firma de la función squareSum que especifica esa función devuelve dos funciones y un valor entero.
Golang también admite definir nuestros propios tipos de funciones.
La versión modificada del programa anterior con tipos de funciones como se muestra a continuación:
package main
import "fmt"
type First func(int) int
type Second func(int) First
func squareSum(x int) Second {
return func(y int) First {
return func(z int) int {
return x*x + y*y + z*z
}
}
}
func main() {
// 5*5 + 6*6 + 7*7
fmt.Println(squareSum(5)(6)(7))
}