고차 함수는 함수를 인자로 전달하거나 함수를 반환하는 함수를 의미합니다. Go 언어는 함수를 first-class citizen으로 다루기 때문에 고차 함수를 지원하며, 이를 통해 코드의 재사용성과 유연성을 높일 수 있습니다.
함수를 인자로 전달하기
Go에서는 함수를 인자로 전달하는 방법이 간단합니다. 함수의 타입을 지정하여 해당 타입의 인자로 전달할 수 있습니다. 다음은 func(int) int
타입의 함수를 인자로 받아 실행하는 예제입니다.
func apply(f func(int) int, x int) int {
return f(x)
}
func double(x int) int {
return x * 2
}
func main() {
result := apply(double, 5)
fmt.Println(result) // 출력: 10
}
위 예제에서 apply
함수는 f
라는 func(int) int
타입의 함수와 x
라는 int
타입의 인자를 받아 f(x)
를 실행하여 결과를 반환합니다. double
함수는 int
를 받아 해당 값의 두 배를 반환하는 함수로, 이를 apply
함수에 전달하여 실행한 결과 10이 출력됩니다.
함수를 반환하기
Go 언어에서는 함수를 반환하는 것도 가능합니다. 함수는 다른 일반 변수와 마찬가지로 반환될 수 있으며, 이를 활용하여 동적으로 함수를 생성할 수 있습니다. 다음은 func() func(int) int
타입의 함수를 반환하는 예제입니다.
func makeMultiplier(n int) func(int) int {
return func(x int) int {
return x * n
}
}
func main() {
multiplyByTwo := makeMultiplier(2)
result := multiplyByTwo(5)
fmt.Println(result) // 출력: 10
multiplyByThree := makeMultiplier(3)
result = multiplyByThree(5)
fmt.Println(result) // 출력: 15
}
위 예제에서 makeMultiplier
함수는 n
이라는 int
타입의 인자를 받아 func(int) int
타입의 함수를 반환합니다. 반환되는 함수는 makeMultiplier
함수의 인자 n
을 활용하여 전달된 x
와 곱셈을 실행한 결과를 반환하는 클로저입니다. multiplyByTwo
와 multiplyByThree
은 각각 2
와 3
을 n
으로 하는 함수를 생성하는 함수입니다. 이렇게 생성된 함수들을 호출하여 결과를 출력하면 10
과 15
가 출력됩니다.
고차 함수를 활용하면 코드의 재사용성을 높이고 유연한 기능을 구현할 수 있습니다. Go 언어에서는 함수가 일급 객체로 취급되므로 고차 함수를 적극적으로 활용하여 효율적인 프로그래밍을 할 수 있습니다.
참고 문서: The Go Programming Language Specification - Function types