2012-08-01 87 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 
相關問題