我正在构建一个应用程序,我想在其中使用一个简单的 mvc 模型
我有一个包 Controller ,里面有这样的 Controller 结构
type UserController struct {}
func (u *UserController) Index(res http.ResponseWriter, req http.Request) {
// some code in it
}
我想要实现的是,我可以通过类似字符串的方式创建该 Controller 的实例
func NewAppController("user") { }
所以我可以通过我的路由请求动态创建我的 Controller 实例
我想到的另一种方法是像这样映射我的 Controller
var controllerProvider = map[string]interface{} {
"user": &controllers.UserController{},
"warehouse": &controllers.WarehouseController{},
}
然后调用它
appController = mux.Vars(req)["controller"]
c := controllerProvider[appController]
但我宁愿使用第一种方式知道如何处理这个吗?
最佳答案
您可以尝试创建一个新对象来实现 reflect.Type
接口(interface),然后通过reflect
的机制来使用它,但这看起来完全是在浪费时间。相反,请考虑以下替代方案:
使用
Name string
和Methods map[string]ActionFunc
等字段创建结构。这会起作用,但对我来说它看起来不是很惯用。 (如果有的话,这让人想起一些 JavaScript OOP 实现。)使用框架。如果您对 MVC 感到满意,为什么不使用已经存在的 Go 的 MVC 框架之一?我想到了 Beego 和 Revel。
彻底重新思考您的架构。据我现在所见,您正在尝试将 Go 编写为 Ruby-on-Rails。去是不同的。从 vanilla
net/http
开始,为您的应用创建一个最小实现。那是你的原型(prototype)。有了这个原型(prototype),您就可以重写和扩展它。想要足智多谋的路线?添加gorilla/mux
或其他选择的路由器。需要数据存储?添加一个 ORM。想要更多的可测试性和灵 active ?接口(interface),接口(interface)无处不在。
关于go - 通过字符串创建一个结构的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24775603/