Go 组织路线和助手
我开始在go(golang)中构建api,但我有几个问题 所以在我的main函数或init函数中(因为我可能使用appengine),我考虑调用一个函数,该函数将使用gorilla mux定义我的所有路由。我的应用程序的每个图片(帖子、评论等)都有一个包含其结构/方法/功能的包 问题:Go 组织路线和助手,go,Go,我开始在go(golang)中构建api,但我有几个问题 所以在我的main函数或init函数中(因为我可能使用appengine),我考虑调用一个函数,该函数将使用gorilla mux定义我的所有路由。我的应用程序的每个图片(帖子、评论等)都有一个包含其结构/方法/功能的包 问题: 因为我想在一个函数中定义路由,所以我是否需要在这个文件中导入我的所有包,以便将请求发送到正确的处理程序 关于helper函数,例如,我想将响应的内容类型设置为application/json,对于所有需要这样做的
内容类型设置为application/json
,对于所有需要这样做的处理程序,我将如何做到这一点
我不是在寻找框架,只是一些关于如何以golang方式克服这些问题的指针。如果在单个函数中定义所有路由,那么包含此函数的文件将需要导入实现处理程序的包。在另一个包中引用类型或函数的唯一方法是导入该包 下面是一个帮助程序,用于设置内容类型并将值编码为JSON:
func JSONHandler(f func(w http.ResponseWriter, r *http.Request) interface{}) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
v := f(w, r)
if v != nil {
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(v); err != nil {
log.Println(err)
}
}
})
}
此函数的参数是一个函数,它返回一个值,并将其编码为JSON。例如,此函数以JSON的形式返回客户端的用户代理
func UserAgentHandler(w http.ResponseWriter, r *http.Request) interface{} {
return struct { UserAgent string }{ req.Header.Get("User-Agent") }
}
使用以下代码向Gorilla mux注册此处理程序r
:
r.Handle("/user-agent", JSONHandler(UserAgentHandler))
改进JSONHandler的方法有很多。我认为您可能需要从一个类似于
main
的包调用Register
,该包导入所有包含包的视图(并且不是由它们导入的),甚至从各种包的init()
调用(但是,我看到了在一个地方组织路由的吸引力)。如果您的帖子/评论/等视图紧密集成,则应用程序的大小不超过一定大小,它们可能不需要是不同的软件包。下面是我对包布局相关问题的回答:JSON内容类型/编码基本上是一个实用函数,可以由定义视图的包导入。所以:路径在“顶部”,utils在“底部”。实际上,有一篇关于这方面的博文(比如“我们如何使用无框架的Go”)涵盖了它们如何处理这一点和其他一些小事情;但是我找不到。如果有人能找到“我们如何使用无框架”的帖子,我将永远爱你。我记得他们编写了自己的包装器来执行JSON en/解码,但我现在真的找不到。