为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 MethodByName().Call() 返回“[<float64 Value>]”?

为什么 MethodByName().Call() 返回“[<float64 Value>]”?

Go
婷婷同学_ 2022-10-10 15:51:17
我有以下界面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])

一切都会开始变得有意义。


查看完整回答
反对 回复 2022-10-10
  • 1 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信