[go] Go 언어에서 고차 함수

고차 함수는 함수를 인자로 전달하거나 함수를 반환하는 함수를 의미합니다. 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와 곱셈을 실행한 결과를 반환하는 클로저입니다. multiplyByTwomultiplyByThree은 각각 23n으로 하는 함수를 생성하는 함수입니다. 이렇게 생성된 함수들을 호출하여 결과를 출력하면 1015가 출력됩니다.

고차 함수를 활용하면 코드의 재사용성을 높이고 유연한 기능을 구현할 수 있습니다. Go 언어에서는 함수가 일급 객체로 취급되므로 고차 함수를 적극적으로 활용하여 효율적인 프로그래밍을 할 수 있습니다.

참고 문서: The Go Programming Language Specification - Function types