猿问

我可以根据golang中的字符串实例不同类型吗?

我想在golang中实现MVC。但似乎很难实现我想要的。在 Testcontroller.go 我有:


func (c *TestController) Test() {

    //

}


func (c *TestController) Index() {

    //

}

只有一个控制器,我可以使用reflect.ValueOf(TestController{}).MethodByName().Call() 来执行该函数。现在我想添加另一个控制器。但似乎我不能通过不同的字符串新建不同的实例:


controllerName := strings.Split(r.URL.Path, "/")

controller = reflect.ValueOf(controllerName[1])

我知道这完全是错误的,但我希望如果 controllerName == "Test" 我可以得到一个 TestController 实例,如果 controllerName == "Index" 得到一个 IndexController 实例,使用反射似乎无法实现我想要的。有什么办法吗?非常感谢!


MMMHUHU
浏览 167回答 1
1回答

DIEA

你可以这样做:为您的控制器定义一个接口:type Controller interface {&nbsp; &nbsp;// Route returns the root route for that controller&nbsp; &nbsp;Route() string}在控制器中只需实现它:// this tells our app what's the route for this controllerfunc (c *TestController) Route() string {&nbsp; &nbsp; return "test"}func (c *TestController) Test() {&nbsp; &nbsp; //}func (c *TestController) Index() {&nbsp; &nbsp; //}在我们的应用程序中,为您的控制器创建一个注册表,您可以查找它们:var controllers = make([]Controller, 0)// register them somehow现在在服务过程中:// assuming the path is /<controller>/<method>controllerName := strings.Split(r.URL.Path, "/")// again, you can use a map here, but for a few controllers it's not worth it probablyfor _, c := range controllers {&nbsp; &nbsp; if c.Route() == controllerName[1] {&nbsp; &nbsp; &nbsp; &nbsp;// do what you did in the single controller example&nbsp; &nbsp; &nbsp; &nbsp;callControllerWithReflection(c, controllerName[2])&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答