我有这样的结构:
$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.go文件中
如何命名注册新用户和登录名?这样做的唯一方法是将register.go和login.go放在自己的文件夹中,如下所示:
routes/
register/
register.go
login/
login.go
希望除了将文件放在自己的文件夹中外,还有另一种方法,这只会在导航文件时产生噪音。
答案 0 :(得分:3)
由于包由导入路径(与目录结构绑定)表示,因此无法执行所需的任何操作。一个目录,一个程序包(出于测试目的,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
中。同样,这是个人喜好。
这也是注入常见依赖项(如数据库连接)的便捷方法。