为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MMMHUHU 2021-09-13 10:39:47
我想在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 实例,使用反射似乎无法实现我想要的。有什么办法吗?非常感谢!
查看完整描述

1 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

你可以这样做:


为您的控制器定义一个接口:


type Controller interface {

   // Route returns the root route for that controller

   Route() string

}

在控制器中只需实现它:


// this tells our app what's the route for this controller

func (c *TestController) Route() string {

    return "test"

}


func (c *TestController) Test() {

    //

}


func (c *TestController) Index() {

    //

}

在我们的应用程序中,为您的控制器创建一个注册表,您可以查找它们:


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 probably

for _, c := range controllers {

    if c.Route() == controllerName[1] {


       // do what you did in the single controller example

       callControllerWithReflection(c, controllerName[2])

    }

}


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信