【发布时间】:2014-12-24 19:18:24
【问题描述】:
TLDR如果您尝试运行它,下面是一个演示问题的游乐场:https://play.golang.org/p/myQtUVg1iq
我正在制作一个 REST API,并且有许多类型的资源可以通过 GET 请求检索
GET http://localhost/api/users
GET http://localhost/api/groups
我有一个模型包,它抽象了不同资源的实现方式:
func(m *UserManager) Get() []Users {
// Internal logic, assume returns correct results
}
func(m *GroupManager) Get() []Groups {
// Internal logic, assume returns correct results
}
路由文件设置所有路由和处理程序:
users := models.UserManager{}
groups := models.GroupManager{}
func GetUsersHandler (w http.ResponseWriter, r *http.Request) {
users := users.Get()
// Implementation details, writing to w as JSON
}
func GetGroupsHandler (w http.ResponseWriter, r *http.Request) {
groups := groups.Get()
// Implementation details, writing to w as JSON
}
func registerRoutes(r *mux.Router) {
r.handleFunc("/api/users", GetUsersHandler).Method("GET")
r.handleFunc("/api/groups", GetGroupsHandler).Method("GET")
}
我试图通过创建一个接口来使其更通用,然后只需要一个 GetHandler。像这样的:
type Getter interface {
Get() []interface{}
}
func GetHandler(g Getter) {
return func(w http.ResponseWriter, r *http.Request) {
results := g.Get()
// Implementation details, writing to w as JSON
}
}
func registerRoutes(r *mux.Router) {
r.handleFunc("/api/users", GetHandler(&users)).Method("GET")
r.handleFunc("/api/groups", GetHandler(&groups)).Method("GET")
}
这真的很接近工作,唯一的问题是模型的返回类型是特定的对象类型,但接口只使用接口返回类型。有什么办法可以在不让模型返回[]interface{}的情况下解决这个问题?
【问题讨论】:
-
不是一个完整的答案,但这个问题可能会有所帮助:stackoverflow.com/questions/3839335/…
-
特别是这个答案:stackoverflow.com/a/3844983/86018 可能会有所帮助。