为什么 MethodByName().Call() 返回“[<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))

    }

}

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>]


婷婷同学_
浏览 88回答 1
1回答

江户川乱折腾

.Call 返回由被调用方法返回的值切片。您在该接口上的两个方法都返回一个 float64,所以这正是您在打印中看到的 - 一个包含单个 float64 值的切片。这是因为该方法可以返回多个值。尝试做fmt.Println(reflect.ValueOf(geometry).MethodByName(method.Name).Call(nil)[0])一切都会开始变得有意义。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go