在外部包中注册 Golang 大猩猩/复用路由



在我的API中,我将为每个路径提供许多完全独立的处理程序,例如"/api/v1/handler_one"和"/api/v1/handler_two"。我正在尝试将每个处理程序放在它自己的包中,以使其更易于维护。

我添加了一个例子。它不起作用,因为它甚至没有加载"handlers/handler_one.go"。我错过了什么?

主去

package main
import (
"net/http"
"git/myapp/router"
)
func main() {
myRouter := router.APIRouter
srv := &http.Server{
Handler: myRouter,
Addr:    "0.0.0.0:8080",
}
log.Fatal(srv.ListenAndServe())
}

router/router.go

package router
import (
"github.com/gorilla/mux"
)
var Router = mux.NewRouter().StrictSlash(true)
var APIRouter = Router.PathPrefix("/api/v1").Subrouter()

handlers/handler_one.go

package handler_one
import (
"git/myapp/router"
)
type Route struct {
Name        string
Method      string
Pattern     string
HandlerFunc http.HandlerFunc
}
type APIRoutes []Route
var apiRoutes = APIRoutes{
Route{ "OneIndex", "GET", "/one", OneIndex, },
}
func init() {
// Register routes
for _, route := range apiRoutes {
var handler http.Handler
handler = route.HandlerFunc
handler = Logger(handler, route.Name)
router.APIRouter.
Methods(route.Method).Path(route.Pattern).Name(route.Name).Handler(handler)
}
}
// OneIndex is handling the requests to /api/v1/one
func OneIndex(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
fmt.Println("Doing something...")
}

它不起作用,因为它甚至没有加载"handlers/handler_one.go">

您的意思是handlers/handler_one.go中的init函数未执行吗?

这是意料之中的,因为在您粘贴的代码中,您不会将该包导入到任何地方。

尝试在main.go中导入该包。

您可以_导入,如果导入的唯一原因是运行init函数。

最新更新