2014-02-06 2 views
2

calling a method by name에 대한 질문을 시작점으로 사용하여 메서드를 이름으로 호출하고 실제로 값을 사용하여 작업하고 싶습니다.리플렉션을 사용하여 메서드 호출 및 값 반환

prog.go:30: cannot use reflect.ValueOf(t).MethodByName("Bar").Call([]reflect.Value literal) (type []reflect.Value) as type int in assignment 
[process exited with non-zero status] 

내가 다르게해야 실제로 값을 반환하기 :

package main 

import "fmt" 
import "reflect" 

type T struct{} 

func (t *T) Foo() { 
    fmt.Println("foo") 
} 

type MyStruct struct { 
    id int 
} 

type Person struct { 
    Name string 
    Age int 
} 

func (t *T) Bar(ms *MyStruct, p *Person) int { 
    return p.Age 

} 

func main() { 
    var t *T 
    reflect.ValueOf(t).MethodByName("Foo").Call([]reflect.Value{}) 
    var ans int 
    ans = reflect.ValueOf(t).MethodByName("Bar").Call([]reflect.Value{reflect.ValueOf(&MyStruct{15}), reflect. ValueOf(&Person{"Dexter", 15})}) 
} 

Playground link, http://play.golang.org/p/e02-KpdQ_P

그러나, 나는 다음과 같은 오류가 발생합니다? 나는 유형 변환을 사용하여 그것을 int으로 만들려고했지만 컴파일러는 []reflect.Value을 사용할 수 없다고 말했다.

답변

3

Call은 슬라이스 인 []reflect.Value을 반환합니다. 유형 변환을 수행하려면 슬라이스에서 요소를 가져와야합니다. reflect.Value 인스턴스가 있으면 Int()을 호출하여 값을 int64로 가져올 수 있습니다.

var ans int64 
ans = reflect.ValueOf(t).MethodByName("Bar").Call([]reflect.Value{ 
    reflect.ValueOf(&MyStruct{15}), 
    reflect.ValueOf(&Person{"Dexter", 15})})[0].Int() 
fmt.Println(ans) 

Playground

관련 문제