为什么 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])
一切都会开始变得有意义。
我有如下界面
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])
一切都会开始变得有意义。