2016-07-26 60 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函数与新创建的结构至极我可以设置字段我猜 –