Размещение файлов в одной папке

У меня такая структура:

$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

Надеюсь, есть другой способ, кроме помещения файлов в их собственную папку, которая просто создает шум при навигации по файлам.

2
0
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Alexander Mills 26.10.2018 22:13

Другие вопросы по теме