我有这个结构:
$GOPATH/
src/
foo/
main.go
routes/
register.go
login.go
在main.go中,我有:
import "foo/routes"
router.HandleFunc("/register", routes.RegisterNewUser).Methods("GET")
router.HandleFunc("/login", routes.Login).Methods("GET")
routes.RegisterNewUser位于routes / register.go文件routes.Login位于routes / login.go文件中
我如何命名RegisterNewUser和登录?这是唯一的方法,将register.go和login.go放在他们自己的文件夹中,如下所示:
routes/
register/
register.go
login/
login.go
希望还有另一种方法,除了将文件放在他们自己的文件夹中,这只是在导航文件时发出噪音。
没有任何方法可以做你想要的,因为包由引导路径表示,它与目录结构相关联。一个目录,一个包(例外是package routes_test
,用于测试目的)。
在我的观察中,许多Go程序员似乎更喜欢更大的包,而不是在较小的包中细分事物。我发现例如HTTP处理程序通常很好,因为它们往往是相当小的函数,大部分逻辑都在其他地方,例如“服务”,“模型”或者您在架构中命名它的任何东西。
这是个人品味的问题,并且一些程序员通过将它们放在子目录中来将它们的代码细分为更小的包,就像你在你的例子中所做的那样。
另一个选择可能是将事物划分为结构:
routes/login.go
:
package routes
type LoginHandler struct {}
func (h LoginHandler) Login(r *http.Request, w http.ResponseWriter) {
// ...
}
// .. other methods related to Login etc. ..
routes/register.go
:
package routes
type RegisterHandler struct {}
func (h RegisterHandler) NewUser(r *http.Request, w http.ResponseWriter) {
// ...
}
// .. other methods related to registration etc. ..
然后用例如注册:
login := routes.Login{}
router.HandleFunc("/login", login.Login).Methods("GET")
register := routes.Register{}
router.HandleFunc("/register", register.NewUser).Methods("GET")
您还可以将Mount()
或Routes()
方法添加到LoginHandler
和RegisterHandler
类型,如下所示:
type LoginHandler struct {}
// Mount the routes.
func (h LoginHandler) Mount(router someRouterType) {
router.HandleFunc("/login", h.Login).Methods("GET")
}
而不是把它们全部放在main.go
。这也是个人品味的问题。
这也是注入公共依赖项(如数据库连接)的便捷方法。