我有以下界面import ( "fmt" "reflect")type geometry interface { Area() float64 Perimeter() float64}func prettyPrint(geometry geometry) { geometryType := reflect.TypeOf(geometry) fmt.Println(geometryType.Name()) fmt.Printf("\t%+v\n", geometry) for i := 0; i < geometryType.NumMethod(); i++ { method := geometryType.Method(i) fmt.Println(method.Name) fmt.Println(reflect.ValueOf(geometry).MethodByName(method.Name).Call(nil)) }}prettyPrint使用实现的类型调用时geometry:func main() { circle := circle{radius: 5} prettyPrint(circle)}这是输出circle {radius:5}Area[<float64 Value>]Perimeter[<float64 Value>]我不太了解该reflect.Call()方法,或者为什么将每个值打印为[<float64 Value>]- 我试图通过调用传入geometry类型的 func 来获取结果输出我试过传入[]reflect.Value{}而不是nil按照网上各个地方的建议传递,但它给出的结果与上面相同谁能阐明这里到底发生了什么?我也在其他地方尝试过这种Invoke方法func Invoke(any interface{}, name string, args ...interface{}) { inputs := make([]reflect.Value, len(args)) for i, _ := range args { inputs[i] = reflect.ValueOf(args[i]) } fmt.Println(reflect.ValueOf(any).MethodByName(name).Call(inputs))}它给出了相同的结果..Invoke(circle{}, "Area")输出[<float64 Value>]
1 回答
江户川乱折腾
TA贡献1851条经验 获得超5个赞
.Call 返回由被调用方法返回的值切片。您在该接口上的两个方法都返回一个 float64,所以这正是您在打印中看到的 - 一个包含单个 float64 值的切片。这是因为该方法可以返回多个值。
尝试做
fmt.Println(reflect.ValueOf(geometry).MethodByName(method.Name).Call(nil)[0])
一切都会开始变得有意义。
- 1 回答
- 0 关注
- 77 浏览
添加回答
举报
0/150
提交
取消