동적 함수 호출
reflect로 함수를 호출하고 값을 설정합니다.
동적 함수 호출은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
reflect.Value.Call
Value.Call(args)는 주어진 인수([]reflect.Value)로 Value가 나타내는 함수를 호출하고, 결과를 []reflect.Value로 반환합니다.
fn := reflect.ValueOf(add)
results := fn.Call([]reflect.Value{
reflect.ValueOf(2),
reflect.ValueOf(3),
})
fmt.Println(results[0].Int()) // 5인수 타입 확인
호출하기 전에 인수 타입이 함수 서명과 일치하는지 확인합니다. 타입이 일치하지 않으면 패닉이 발생합니다.
t := reflect.TypeOf(fn)
if t.NumIn() != len(args) { panic("wrong arg count") }
for i, arg := range args {
if !reflect.TypeOf(arg).AssignableTo(t.In(i)) { panic("type mismatch") }
}가변 인수 함수
Value.Call을 사용하여 가변 인수 함수를 호출할 수 있습니다(슬라이스를 펼쳐 전달). 또는 Value.CallSlice를 사용하여 가변 인수를 슬라이스 값으로 전달할 수 있습니다:
sum := reflect.ValueOf(func(ns ...int) int {
total := 0
for _, n := range ns { total += n }
return total
})
args := reflect.ValueOf([]int{1,2,3})
results := sum.CallSlice([]reflect.Value{args})reflect.MakeFunc
reflect.MakeFunc는 주어진 타입과 래퍼 본문을 사용하여 실행 중에 새 함수를 만듭니다. 인터페이스용 어댑터 함수를 생성할 때 사용합니다.
t := reflect.TypeOf(func(int) string { return "" })
fn := reflect.MakeFunc(t, func(args []reflect.Value) []reflect.Value {
return []reflect.Value{reflect.ValueOf(strconv.Itoa(args[0].Interface().(int)))}
})이름으로 메서드 호출
이름으로 메서드를 가져와 호출합니다:
v := reflect.ValueOf(myObj)
m := v.MethodByName("Process")
if m.IsValid() {
m.Call(nil)
}메서드 존재 여부 확인
호출하기 전에 항상 m.IsValid()를 확인합니다. MethodByName은 메서드를 찾지 못하면 0 값을 반환하며, 0 값을 호출하면 패닉이 발생합니다.
동적 디스패치 사용 사례
동적 함수 호출은 플러그인 시스템(문자열 이름으로 함수 호출), 테스트 프레임워크(TestXxx 함수 호출), RPC 디스패처(메서드 이름을 핸들러에 매핑), 데코레이터에서 사용됩니다.
성능
reflect.Call은 직접 호출보다 약 10~50배 느립니다. 자주 호출하는 함수의 reflect.Value를 캐시하고, 자주 실행되는 루프에서는 사용하지 않습니다.
타입 안전 래퍼
시작 중에 리플렉션 처리를 한 번 수행하고 캐시된 Value를 반복해서 호출하는 타입 지정 헬퍼로 동적 호출을 감쌉니다:
type Processor func(context.Context, []byte) ([]byte, error)
// Build at startup, reuse at request time오류 반환 처리
함수가 마지막 결과로 오류를 반환한다면 이를 추출하여 확인합니다:
results := fn.Call(args)
if !results[len(results)-1].IsNil() {
return results[len(results)-1].Interface().(error)
}리플렉션의 대안
함수 집합을 컴파일 시점에 알고 있다면 리플렉션 대신 함수 값의 맵(map[string]func(...))을 사용합니다. 이 방식이 더 안전하고 빠릅니다.
handlers := map[string]func(ctx context.Context, req []byte) []byte{
"greet": greetHandler,
}빠른 확인
reflect.Value.Call은 무엇을 반환합니까?
요약: 동적 함수 호출
핵심 내용:
- Value.Call([]reflect.Value)은 함수를 호출하고 []reflect.Value를 반환합니다
- MethodByName의 결과를 호출하기 전에 m.IsValid()를 확인합니다
- MakeFunc은 실행 중에 주어진 타입의 새 함수를 만듭니다
- 함수 집합을 알고 있다면 리플렉션보다 map[string]func을 우선 사용합니다
자주 묻는 질문
“동적 함수 호출” 강의는 무료인가요?
네 — “동적 함수 호출” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“동적 함수 호출”에서 뭘 배우나요?
reflect로 함수를 호출하고 값을 설정합니다. 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“동적 함수 호출” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.