好的..。我已经或者正在编写一个web框架包,叫做mao。
我希望在控制器中定义我的路由。
在mao中
type (
Controller struct {
Route Route
}
Route struct {
Name, Host, Path, Method string
}
)在mao导入包中
控制器/default.go
type DefaultController struct {
mao.Controller
}
func (this *DefaultController) Index() Response {
this.Route = mao.Route{"default_index","localhost","/", "GET"}
}现在,由于我想在控制器中定义我的路由,路由器在实例化时应该读取所有控制器。这就是问题所在。
我如何将包名传递给我的路由器,以便它能够获取该包中的所有结构和函数?这有可能吗?
发布于 2014-03-05 12:05:31
你所要求的在Go中是不可能的,因为它没有方法枚举一个包/程序中的所有类型。
一种替代方案是遵循database/sql包,并拥有一个系统,在该系统中,其他包可以在导入时注册到该系统。
例如,要在该软件包中使用PostgreSQL驱动程序,您可以执行以下操作:
import (
_ "github.com/lib/pq"
"database/sql"
)
...
db, err := sql.Open("postgres", "dbname=test")postgres驱动程序在github.com/lib/pq包初始化期间注册。以下是该包中的相关代码(省略了一些不相关的部分):
package pq
import (
"database/sql"
)
type drv struct{}
func (d *drv) Open(name string) (driver.Conn, error) {
return Open(name)
}
func init() {
sql.Register("postgres", &drv{})
}也许您可以像这样创建一个注册API来查找程序中可用的各种实现?
发布于 2014-03-06 19:06:15
老实说,我认为你做错了。“自动注册”混淆了所发生的事情,并将导致难以测试和推理的代码。
我建议使控制器成为一个接口,该接口应该由具体的控制器满足,并在路由器上有一个Add(c Controller)方法,以便在调用主项目(导入路由器和控制器)中分配控制器。这应该使你的代码更容易理解和明确,更符合go的精神。
database/sql驱动程序注册在更大程度上是一种黑客行为,不应被视为最佳实践。
发布于 2014-03-07 04:19:08
我认为你应该有一个路由器的结构(这很可能是全局的,就像http.DefaultClient),然后在你的控制器的构造函数中,你可以将这个路由器作为依赖注入,以便为路由器注入一个相关的路由。DI+interfaces让你的代码变得很好并且可测试,不仅仅是在Go中。
这只是个想法。
https://stackoverflow.com/questions/22185425
复制相似问题