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

Why does MethodByName().Call() return "[<float64 Value>]"?

我有如下界面

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))
    }
}

使用实现 geometry 的类型调用 prettyPrint 时:

func main() {
    circle := circle{radius: 5}
    prettyPrint(circle)
}

这是输出

circle
        {radius:5}
Area
[<float64 Value>]
Perimeter
[<float64 Value>]

我不太了解 reflect.Call() 方法,或者为什么它会将每个值打印为 [<float64 Value>] - 我正在尝试通过调用传入的函数来获取结果输出 geometry类型

我试过按照网上各个地方的建议传入 []reflect.Value{} 而不是 nil,但结果与上面相同

任何人都可以阐明这里到底发生了什么吗?


我也在 SO

的其他地方尝试了这个 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>]

.Call return 是一片值,return由调用的方法编辑。该接口上的两个方法 return 都是 float64,所以这正是您在打印中看到的 - 一个包含单个 float64 值的切片。这是因为该方法可以 returning 多个值。

试试

fmt.Println(reflect.ValueOf(geometry).MethodByName(method.Name).Call(nil)[0])

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