Translate

domingo, 23 de octubre de 2022

Funciones en Go parte 2


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))

}