2016-07-26 97 views
-1

目前,我有以下代碼獲取結構

func (r *Router) Get(path string, controller interface{}) { 
    ... 
    t := reflect.TypeOf(controller) 
    ... 
} 

這就是所謂做以下

Route.Get("/", controllers.Test.IsWorking) 

第二個參數是基本上這

type Test struct { 
    *Controller 
    Name string 
} 

func (t Test) IsWorking() { 

} 

type Controller struct { 
    Method string 
    Request *http.Request 
    Response http.ResponseWriter 
    Data  map[interface{}]interface{} 
} 

我想獲取函數引用的結構體。創建該類型的新結構和調用功能,因此例如

controllers.Test.IsWorking

創建一個測試結構並調用IsWorking()

回答

0

爲了使新的指針到一個新分配的結構在接口的類型,你需要的是

newController := reflect.New(reflect.TypeOf(controller)).Interface() 

或者設置先對新實例的值:

newController := reflect.New(reflect.TypeOf(controller)) 
newController.Elem().FieldbyName("Method").Set(reflect.ValueOf("GET")) 

如果你想創建一個指向結構並調用IsWorking方法,它看起來像

t := reflect.New(reflect.TypeOf(Test{})) 
t.MethodByName("IsWorking").Call(nil) 
+0

我不認爲這是我所期待的。或者它可能不錯。我想獲得函數所指的結構,填充該結構的字段並調用正在傳遞的函數。這是爲了創建一個新的控制器並將字段設置爲否?我的意思是這也是我正在尋找的一部分 –

+0

@AlvaroCarvajalNakosmai:你說你的方法沒有期待指針,但是如果你沒有指向它的指針,你不能改變結構的值。 – JimB

+0

確實今天有點過時了。我不想編輯結構的值,但在運行時創建它,所以當函數傳遞controllers.Test.IsWorking創建一個Test結構並調用Test.IsWorking函數與新創建的結構至極我可以設置字段我猜 –