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/

相关文章:

go - 在 HTTP 处理程序中提供子目录服务 [GoLang]

go - 从 router.HandleFunc 调用返回多个中间件函数

go - 修改任何具有特定字段的结构的函数

跨并行 goroutine 共享 channel 时的 Golang 竞争条件

go - 解码base64并将其编码为十六进制

go - 如何在同一应用程序中使用 gorilla websocket和mux?

mongodb - 使用 golang 转到 MongoDB 中的特定文档

pointers - 返回给函数的调用者时无法保留 golang 字段的值

Go - 如何子类型化包装错误类?

http - 客户端未使用 websocket 协议(protocol) : 'upgrade' token not found in 'Connection' header