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())
}
intSeq()
함수는 또다른 함수를 리턴하고 있습니다. intSeq함수 내부에서 또다시
익명함수를 선언하고 있습니다. 함수에 선언된i
변수를 내부 익명함수에서도
사용할 수 있는 이런 기능을 바로클로저(Closures)
라고 부릅니다.intSeq()
함수를 호출한 후 반환값이 함수를nextInt
변수에 대입하고 있습니다.
이 함수에서는 함수 내부의i
값을 반환받게 됩니다. 이 값은 호출할때 마다 달라집니다.- 클로저를 이용해서
nextInt
함수를 몇번이든 호출해도 그때마다 값이 달라지게 됩니다. intSeq()
함수를 또다른 변수에 할당해서 새로운 값으로 테스트 할 수 있습니다.
실행하면 다음과 같습니다.
$ go run closures.go
1
2
3
1
함수에서 남은기능은 바로 재귀호출 입니다.