2012-08-01 88 views

回答

38

Here is an example,复制和粘贴小心:

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

你为什么这么说?复制和粘贴仔细? :) – loyalflow 2012-08-01 19:53:42

+0

,因为我复制了代码,并且想要说清楚:) – perreal 2012-08-01 19:55:31

+10

我很想看到比复制代码更多的问题。首先,你可以添加一个“是”/“否”/“部分”等等。然后描述一下你的代码实际上做了什么。 – Kissaki 2012-08-02 08:55:11

1

在计算机编程,一个匿名函数或lambda抽象(func )是一个不绑定到标识符的函数定义,并且Go支持可以形成闭包的匿名函数。当你想定义一个内联函数而不必命名它时,匿名函数很有用。

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

功能intSeq返回另一个功能,这是我们在intSeq的身体匿名定义。返回的函数在变量i上关闭以形成闭包

Output 
$ go run closures.go 
1 
2 
3 
1 
相关问题