2012-08-01 28 views

Respuesta

38

Here is an example, copiado y pegado con cuidado:

package main 

import fmt "fmt" 

type Stringy func() string 

func foo() string{ 
    return "Stringy function" 
} 

func takesAFunction(foo Stringy){ 
    fmt.Printf("takesAFunction: %v\n", foo()) 
} 

func returnsAFunction()Stringy{ 
    return func()string{ 
    fmt.Printf("Inner stringy function\n"); 
    return "bar" // have to return a string to be stringy 
    } 
} 

func main(){ 
    takesAFunction(foo); 
    var f Stringy = returnsAFunction(); 
    f(); 
    var baz Stringy = func()string{ 
    return "anonymous stringy\n" 
    }; 
    fmt.Printf(baz()); 
} 
+5

¿por qué dijiste eso? copiado y pegado con cuidado? :) – loyalflow

+0

porque copié el código, y quería dejarlo claro :) – perreal

+10

Me encantaría ver más sobre su pregunta que el código copiado. En primer lugar, puede agregar un "sí"/"no"/"parcialmente", etc. Luego, un poco de descripción, lo que realmente hace su código. – Kissaki

1

En la programación de computadoras, un función anónima o abstracción lambda (func literal de literal) es una definición de función que no está vinculada a un identificador, y Go admite funciones anónimas, que pueden formar cierres. Las funciones anónimas son útiles cuando quiere definir una función en línea sin tener que nombrarla.

package main 
    import "fmt" 

    func intSeq() func() int { 
     i := 0 
     return func() int { 
      i += 1 
      return i 
     } 
    } 


    func main() { 
     nextInt := intSeq() 
     fmt.Println(nextInt()) 
     fmt.Println(nextInt()) 
     fmt.Println(nextInt()) 
     newInts := intSeq() 
     fmt.Println(newInts()) 
    } 

function intSeq devuelve otra función, que definimos anónimamente en el cuerpo de intSeq. La función devuelta se cierra sobre la variable i para formar un cierre.

Output 
$ go run closures.go 
1 
2 
3 
1