我有以下界面
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>]
uj5u.com熱心網友回復:
.Call 回傳一個值切片,由呼叫的方法回傳。該介面上的兩個方法都回傳一個 float64,所以這正是您在列印中看到的 - 一個包含單個 float64 值的切片。這是因為該方法可以回傳多個值。
嘗試做
fmt.Println(reflect.ValueOf(geometry).MethodByName(method.Name).Call(nil)[0])
一切都會變得有意義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334880.html
上一篇:在表單資料中去掉前綴的檔案名
下一篇:不能在賦值中使用strings.NewReplacer("#","o")(型別*strings.Replacer)作為型別strings.Replacer
