Создание модулей маршрутизации Go/Echo RestAPI

Я только начал изучать Go и хочу создать свой собственный REST API.

Проблема проста: я хочу, чтобы маршруты моего API были в другом файле, например: routs / users.go, который затем я включал в функцию "main" и регистрировал эти маршруты.

Существует множество примеров restAPI в Echo/Go, но все они имеют маршруты в функции main().

Я проверил несколько примеров / стартовых комплектов github, но мне кажется, что я не могу найти решение, которое мне нравится.

func main() {
    e := echo.New()

    e.GET("/", func(c echo.Context) error {
        responseJSON := &JSResp{Msg: "Hello World!"}
        return c.JSON(http.StatusOK, responseJSON)
    })

     //I want to get rid of this
    e.GET("users", UserController.CreateUser)
    e.POST("users", UserController.UpdateUser)
    e.DELETE("users", UserController.DeleteUser)

    //would like something like
    // UserRoutes.initRoutes(e)

    e.Logger.Fatal(e.Start(":1323"))
}

//UserController.go
//CreateUser 
func CreateUser(c echo.Context) error {
    responseJSON := &JSResp{Msg: "Create User!"}
    return c.JSON(http.StatusOK, responseJSON)
}

//UserRoutes.go
func initRoutes(e) { //this is probably e* echo or something like that
//UserController is a package in this case that exports the CreateUser function
    e.GET("users", UserController.CreateUser) 
    return e;
}

Есть ли простой способ сделать это? Исходя из node.js и сохраняя некоторые синтаксические ошибки, конечно же, их решу, но в данный момент я борюсь с архитектурой своего кода.

1 ответ

Решение

Я хочу, чтобы маршруты моего API были в другом файле, например: routs / users.go, который я затем включил в функцию "main" и зарегистрировал эти маршруты.

Это возможно, просто храните свои файлы в routes Пакет объявляет функции, которые принимают экземпляр *echo.Echo и пусть они зарегистрируют обработчиков.

// routes/users.go

func InitUserRoutes(e *echo.Echo) {
    e.GET("users", UserController.CreateUser)
    e.POST("users", UserController.UpdateUser)
    e.DELETE("users", UserController.DeleteUser)
}


// routes/posts.go

func InitPostRoutes(e *echo.Echo) {
    e.GET("posts", PostController.CreatePost)
    e.POST("posts", PostController.UpdatePost)
    e.DELETE("posts", PostController.DeletePost)
}

а затем в main.go

import (
     "github.com/whatever/echo"
     "package/path/to/routes"
)

func main() {
    e := echo.New()
    routes.InitUserRoutes(e)
    routes.InitPostRoutes(e)
    // ...
}

Обратите внимание, что InitXxx функции должны начинаться с заглавной буквы в отличие от вашего initRoutes пример, который имеет свою первую букву в нижнем регистре. Это связано с тем, что идентификаторы с строчными первыми буквами не экспортируются, что делает их недоступными извне их собственного пакета. Другими словами, чтобы вы могли ссылаться на импортированный идентификатор, вы должны экспортировать его, начав с заглавной буквы.

Подробнее здесь: https://golang.org/ref/spec

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