Файлы пространства имен в той же папке - PullRequest
0 голосов
/ 26 октября 2018

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

$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")

routs .RegisterNewUser находится в файле routs / register.go routs.в файле route / login.go

как мне пространство имен RegisterNewUser и Login?Это единственный способ сделать это, чтобы поместить register.go и login.go в их собственные папки, например:

routes/
  register/
     register.go
  login/
     login.go

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

1 Ответ

0 голосов
/ 26 октября 2018

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

Это также удобный способ ввода общих зависимостей, таких как соединение с базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...