亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 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 關注
  • 115 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號