我正在使用Go編寫(xiě)的模板系統(tǒng),這意味著它需要自由使用該reflect軟件包。在這種特定情況下,我需要能夠在上動(dòng)態(tài)調(diào)用方法interface{}。奇怪的是,只要我的數(shù)據(jù)是已知類(lèi)型,我的反射邏輯就可以正常工作,但如果數(shù)據(jù)是type則不能interface{}。在下面的例子中可以看到,在邏輯main()和Pass()是相同的。唯一的區(qū)別是數(shù)據(jù)是內(nèi)部的已知類(lèi)型還是已知類(lèi)型interface{}播放:http://play.golang.org/p/FTP3wgc0sZpackage mainimport ( "fmt" "reflect")type Test struct { Start string}func (t *Test) Finish() string { return t.Start + "finish"}func Pass(i interface{}) { _, ok := reflect.TypeOf(&i).MethodByName("Finish") if ok { fmt.Println(reflect.ValueOf(&i).MethodByName("Finish").Call([]reflect.Value{})[0]) } else { fmt.Println("Pass() fail") }}func main() { i := Test{Start: "start"} Pass(i) _, ok := reflect.TypeOf(&i).MethodByName("Finish") if ok { fmt.Println(reflect.ValueOf(&i).MethodByName("Finish").Call([]reflect.Value{})[0]) } else { fmt.Println("main() fail") }}執(zhí)行此代碼后,我們得到以下結(jié)果Pass() failstartfinish這意味著我的動(dòng)態(tài)調(diào)用方法的方法可以正常工作,除非在我的對(duì)象當(dāng)前位于的情況下interface{}。相反,如果我不使用指針接收器并通過(guò),i那么它將按預(yù)期工作。播放:http://play.golang.org/p/myM0UXVYzX這使我相信我的問(wèn)題是,&i當(dāng)i()為時(shí),我無(wú)法訪問(wèn)其地址interface{}。我已經(jīng)仔細(xì)檢查了反射包并測(cè)試了諸如reflect.Value.Addr()和這樣的東西,reflect.PtrTo()但是我都無(wú)法按照我需要的方式工作。我的直覺(jué)是,這與interface{}定義為參考對(duì)象這一事實(shí)有關(guān)。
- 3 回答
- 0 關(guān)注
- 220 瀏覽
添加回答
舉報(bào)
0/150
提交
取消