go - 在外部包中注册 Golang gorilla/mux 路由

标签 go gorilla

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

我添加了一个示例。它不工作,因为它甚至没有加载“handlers/handler_one.go”。我错过了什么?

主.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.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...")
}

最佳答案

It's not working since it's not even loading "handlers/handler_one.go"

你的意思是handlers/handler_one.go中的init函数没有被执行?

这是预料之中的,因为在您粘贴的代码中您没有在任何地方导入该包。

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

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

关于go - 在外部包中注册 Golang gorilla/mux 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44418576/

相关文章:

amazon-web-services - AWS SDK Go Lambda 单元测试

go - 如何使用反射附加到 slice ?

Gorilla/Martini session 在 Cloud9 IDE 环境中不工作

go - 在不同的 goroutine 中替换字符串的值时是否需要互斥锁?

戈朗 : runtime error: invalid memory address or nil pointer dereference

csv - 总结csv的内容

go - 使用 Gorilla FormatCloseMessage 客户端收到错误代码

http - 在 Go 中挂载双 http 路由器

session - 为什么要使用 gorilla/context 而不是 session 来进行用户身份验证?

go - 使 golang Gorilla CORS 处理程序工作