더북(TheBook)

함수/메서드 동적 호출

리플렉션을 사용하면 동적으로 함수나 메서드를 호출할 수 있다. 다음 예제는 TitleCase() 함수를 두 번 호출하여 결괏값을 출력하는데, 첫 번째는 함수를 바로 호출하고 두 번째는 리플렉션을 사용한다.


func TitleCase(s string) string {
    return strings.Title(s)
}
 
func main() {
    caption := "go is an open source programming language"
   
    // TitleCase를 바로 호출
    title := TitleCase(caption)
    fmt.Println(title)
     
    // TitleCase를 동적으로 호출
    titleFuncValue := reflect.ValueOf(TitleCase)
    values := titleFuncValue.Call([]reflect.Value{reflect.ValueOf(caption)})
    title = values[0].String()
    fmt.Println(title)
}

실행 결과

Go Is An Open Source Programming Language
Go Is An Open Source Programming Language

reflect.Value.Call() 메서드는 []reflect.Value 타입 슬라이스를 매개변수로 받아 동적으로 함수를 실행한 후 그 결과를 []reflect.Value 타입으로 반환한다. 이 예제에서는 []reflect.Value 슬라이스에 문자열 하나를 담아 매개변수로 전달했고, reflect.Value.Call() 메서드의 결과로 문자열 하나가 담긴 []reflect.Value 슬라이스가 반환됐다.

메서드도 같은 방식으로 호출할 수 있다.

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