더북(TheBook)

2.4.6 함수를 매개변수로 전달하기

함수를 다른 함수의 매개변수로 사용할 수도 있다. 매개변수로 전달된 함수는 함수 내에서 호출된다. 다음 예제를 보자.

▼ 함수를 매개변수로 전달

package main
  
import "fmt"
  
func callback(y int, f func(int, int)) {
    f(y, 2) // add(1, 2)를 호출
}
  
func add(a, b int) {
    fmt.Printf("%d + %d = %d\n", a, b, a+b) // 1 + 2 = 3
}
  
func main() {
    callback(1, add) // 1 + 2 = 3
}

실행 결과

1 + 2 = 3

callback 함수는 첫 번째 매개변수로 받은 정숫값을 사용하여 두 번째 매개변수로 받은 f 함수를 호출한다. main 함수에서 callback(1, add)를 호출하면 callback 함수에서는 add(1, 2)를 호출한다.

함수를 매개변수로 전달하는 것은 Go의 기본 라이브러리에서도 흔히 볼 수 있다. 대표적인 예는 strings 패키지의 IndexFunc 함수이다.

func IndexFunc(s string, f func(rune) bool) int

strings.IndexFunc 함수는 문자열 변수 s에서 f의 수행 결과가 true인 첫 번째 인덱스를 반환한다. 다음과 같이 사용할 수 있다.

▼ 함수를 매개변수로 전달하는 코드

package main
  
import (
    "fmt"
    "strings"
    "unicode"
)
  
func main() {
    // 한글이 처음으로 나타나는 인덱스를 반환
    f := func(c rune) bool {
        return unicode.Is(unicode.Hangul, c) // c가 한글이면 true를 반환
    }
    fmt.Println(strings.IndexFunc("Hello, 월드", f))  // 7
    fmt.Println(strings.IndexFunc("Hello, world", f)) // -1
}

실행 결과

7

-1

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.