2012-08-01 20 views

cevap

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

neden bunu söylediniz? kopyalandı ve dikkatlice yapıştırıldı mı? :) – loyalflow

+0

çünkü kodu kopyaladım ve bunu açıklığa kavuşturmak istedim :) – perreal

+10

Kopyaladığınız koddan daha fazla soruyu görmeyi çok isterim. İlk ve en önemlisi, bir "evet"/"hayır"/"kısmen" vb. Ekleyebilirsiniz. Ardından, kodunuzun gerçekte ne yaptığı açıklayıcıdır. – Kissaki

1

Evet bilgisayar programlama olarak

, bir

dil spec bakın anonim işlev veya lambda soyutlama (func tion literal), tanımlayıcıya bağlı olmayan bir işlev tanımıdır ve Go, kapanış oluşturabilen anonim işlevleri olan'u destekler. Anonim işlevler, isimlendirmek zorunda kalmadan satır içi bir işlevi tanımlamak istediğinizde kullanışlıdır. Biz intSeq gövdesinde anonim olarak tanımlayan başka bir işlev, döner intSeq

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

işlevi. döndürülen işlev, numaralı bir kapanış oluşturmak için I değişkeninin üzerinden kapanır.

Output 
$ go run closures.go 
1 
2 
3 
1 
İlgili konular