首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转到: reflect catch22 reflect包

转到: reflect catch22 reflect包
EN

Stack Overflow用户
提问于 2014-03-05 07:30:41
回答 3查看 158关注 0票数 1

好的..。我已经或者正在编写一个web框架包,叫做mao。

我希望在控制器中定义我的路由。

在mao中

代码语言:javascript
复制
type (
    Controller struct {
        Route Route
    }
    Route struct {
        Name, Host, Path, Method string
    }
)

在mao导入包中

控制器/default.go

代码语言:javascript
复制
type DefaultController struct {
    mao.Controller
}
func (this *DefaultController) Index() Response {
    this.Route = mao.Route{"default_index","localhost","/", "GET"}
}

现在,由于我想在控制器中定义我的路由,路由器在实例化时应该读取所有控制器。这就是问题所在。

我如何将包名传递给我的路由器,以便它能够获取该包中的所有结构和函数?这有可能吗?

EN

回答 3

Stack Overflow用户

发布于 2014-03-05 12:05:31

你所要求的在Go中是不可能的,因为它没有方法枚举一个包/程序中的所有类型。

一种替代方案是遵循database/sql包,并拥有一个系统,在该系统中,其他包可以在导入时注册到该系统。

例如,要在该软件包中使用PostgreSQL驱动程序,您可以执行以下操作:

代码语言:javascript
复制
import (
    _ "github.com/lib/pq"
    "database/sql"
)

...
db, err := sql.Open("postgres", "dbname=test")

postgres驱动程序在github.com/lib/pq包初始化期间注册。以下是该包中的相关代码(省略了一些不相关的部分):

代码语言:javascript
复制
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来查找程序中可用的各种实现?

票数 2
EN

Stack Overflow用户

发布于 2014-03-06 19:06:15

老实说,我认为你做错了。“自动注册”混淆了所发生的事情,并将导致难以测试和推理的代码。

我建议使控制器成为一个接口,该接口应该由具体的控制器满足,并在路由器上有一个Add(c Controller)方法,以便在调用主项目(导入路由器和控制器)中分配控制器。这应该使你的代码更容易理解和明确,更符合go的精神。

database/sql驱动程序注册在更大程度上是一种黑客行为,不应被视为最佳实践。

票数 0
EN

Stack Overflow用户

发布于 2014-03-07 04:19:08

我认为你应该有一个路由器的结构(这很可能是全局的,就像http.DefaultClient),然后在你的控制器的构造函数中,你可以将这个路由器作为依赖注入,以便为路由器注入一个相关的路由。DI+interfaces让你的代码变得很好并且可测试,不仅仅是在Go中。

这只是个想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22185425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档