2012-08-01 2 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

+0

내가 코드를 복사했기 때문에 그것을 명확하게하고 싶었습니다. – perreal

+10

나는 복사 된 코드보다 질문에 더 많이보고 싶습니다. 가장 먼저, "예"/ "아니오"/ "부분적으로"등을 추가 할 수 있습니다. 그런 다음 약간의 설명, 코드가 실제로하는 일. – Kissaki

1

예 컴퓨터 프로그래밍에서

,

언어 사양을 참조하십시오 익명 함수 또는 람다 추상화 (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()) 
    } 

function intSeq 함수는 intSeq 본문에서 익명으로 정의하는 다른 함수를 반환합니다. 반환 된 함수는 변수 i를 닫음으로써 닫음을 형성합니다.

Output 
$ go run closures.go 
1 
2 
3 
1