我有以下界面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])
一切都會開始變得有意義。
- 1 回答
- 0 關注
- 115 瀏覽
添加回答
舉報
0/150
提交
取消