У меня такая структура:
$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
как я могу зарегистрировать пространство имен и войти в систему? Единственный способ сделать это - поместить 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
. Это опять же дело личного вкуса.
Это также удобный способ внедрения общих зависимостей, таких как соединение с базой данных.
этот ответ действительно помог мне, цените это ... размещение файлов в их собственной папке не так уж и плохо, учитывая, что у вас должно быть как минимум 2, x.go и x_test.go, но метод, который вы здесь используете, все еще полезен для маршрутизации