【问题标题】:Using reflection to call a method and return a value使用反射调用方法并返回值
【发布时间】:2014-03-02 21:05:03
【问题描述】:

以关于calling a method by name 的问题为起点,我想通过名称调用一个方法并实际使用该值做一些事情。

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

但是,我收到以下错误:

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] 

我应该做些什么不同的事情来实际返回一个值?我尝试使用类型转换并使其成为int,但编译器说它不能[]reflect.Value

【问题讨论】:

标签: oop reflection methods go


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多