GO 언어는 클로저를 지원합니다.
클로저는 함수 안에서 함수를 선언 및 정의할 수 있고, 바깥쪽 함수에 선언된 변수에도 접근할 수 있는 함수를 말합니다.
바깥 함수가 변수와 자기 자신(함수)을 에워싸고 (close over) 있다고 해서 클로저 (closure) 라고 합니다.
다음은 함수 안에서 함수를 선언하고 정의하는 방법입니다.
func main() { sum := func(a, b int) int { return a + b } r := sum(1, 2) // 익명 함수 사용 fmt.Println(r) // 3 }
익명 함수는 일반적인 함수와는 달리 함수를 정의할 때 이름이 없습니다.
매개변수와 리턴값을 지정하는 방법과 함수를 호출하는 방법은 일반적인 함수와 같습니다.
단, 함수가 들어 있는 변수를 함수처럼 호출하게 됩니다.
이번에는 이름이 없는 익명 함수의 바깥에 있는 변수를 사용해보겠습니다.
간단하게 y = ax + b 를 구하는 함수입니다.
func main() { a, b := 3, 5 f := func(x int) int { return a*x + b // 함수 바깥의 변수 a, b 사용 } y := f(5) fmt.Println(y) // 20 }
func(x int) int 함수의 내용을 보면 바깥의 main 함수에 선언된 변수 a와 b를 사용하고 있습니다.
이처럼 익명 함수 안에서 바깥의 변수에 접근하는 클로저를 사용할 수 있습니다.
클로저를 사용하면 지역 변수가 소멸되지 않고, 나중에 함수를 호출할 때마다 계속 가져다 쓸 수 있습니다.
즉, 클로저는 함수가 선언될 때의 환경을 계속 유지합니다.
클로저는 함수형 언어의 큰 특징이며 Go 언어는 클로저를 통해 함수형 언어의 기능을 구현하고 있습니다.
func 함수명() func(매개변수명 자료형) 리턴값_자료형