Go by Example: [15] Closures

Closures

Go언어는 익명함수를 지원하며, 이것을 클로저(Closures)라고 부릅니다.
익명함수는 함수 내부에서 이름없는 1회용 함수를 임시로 만들어서 사용하고
싶을때 주로 사용 합니다.

package main

import "fmt"

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

func main() {
    
    nextInt := intSeq()          // [2]
    
    fmt.Println(nextInt())       // [3]
    fmt.Println(nextInt())
    fmt.PRintln(nextInt())
    
    newInts := intSeq()          // [4]
    fmt.Println(newInts())
}
  1. intSeq()함수는 또다른 함수를 리턴하고 있습니다. intSeq함수 내부에서 또다시
    익명함수를 선언하고 있습니다. 함수에 선언된 i변수를 내부 익명함수에서도
    사용할 수 있는 이런 기능을 바로 클로저(Closures)라고 부릅니다.
  2. intSeq()함수를 호출한 후 반환값이 함수를 nextInt변수에 대입하고 있습니다.
    이 함수에서는 함수 내부의 i값을 반환받게 됩니다. 이 값은 호출할때 마다 달라집니다.
  3. 클로저를 이용해서 nextInt함수를 몇번이든 호출해도 그때마다 값이 달라지게 됩니다.
  4. intSeq()함수를 또다른 변수에 할당해서 새로운 값으로 테스트 할 수 있습니다.

실행하면 다음과 같습니다.

$ go run closures.go
1
2
3
1

함수에서 남은기능은 바로 재귀호출 입니다.