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