Нет никакого способа сделать то, что вы хотите, поскольку пакеты обозначаются путем импорта, который связан со структурой каталогов. Один каталог, один пакет (исключение составляет 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
. Это опять-таки вопрос личного вкуса.
Это также удобный способ ввода общих зависимостей, таких как соединение с базой данных.