Rest 在Go中注册到中心对象的路由

Rest 在Go中注册到中心对象的路由,rest,go,gorilla,Rest,Go,Gorilla,我正在使用Mux开发一个简单的Go-restapi。我找到的大多数教程都建议按如下方式创建路由器: 一个routes.go文件,其中包含所有路由和所有路由处理程序的全局数组 一个router.go文件,它创建一个路由器对象并在全局数组上循环,并将所有内容注册到路由器 我宁愿使用不同的模型: 一个router.go文件实例化一个路由器对象,并具有一个RegisterRoute函数 每个代表API不同对象或组件的文件都可以调用RegisterRoute,并向路由器添加其他路由 我不知道该怎么

我正在使用Mux开发一个简单的Go-restapi。我找到的大多数教程都建议按如下方式创建路由器:

  • 一个
    routes.go
    文件,其中包含所有路由和所有路由处理程序的全局数组
  • 一个
    router.go
    文件,它创建一个路由器对象并在全局数组上循环,并将所有内容注册到路由器
我宁愿使用不同的模型:

  • 一个
    router.go
    文件实例化一个路由器对象,并具有一个
    RegisterRoute
    函数
  • 每个代表API不同对象或组件的文件都可以调用
    RegisterRoute
    ,并向路由器添加其他路由

我不知道该怎么做,因为它似乎需要为每个文件创建一个初始化函数,并从
main()
调用它(这不符合目的)。有什么公认的方法可以做到这一点吗?

您可以使用
func init()
。它是一个特殊函数,在程序执行之前,在包初始化期间调用

下面是一个如何使用gorilla/mux路由器实现所需的示例,尽管它可以通过任何其他mux库实现

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

// main.go

type Route struct {
    Name        string
    Method      string
    Pattern     string
    HandlerFunc http.HandlerFunc
}

var routes []Route

func registerRoute(route Route) {
    routes = append(routes, route)
}

func main() {
    router := mux.NewRouter().StrictSlash(false)
    for _, route := range routes {
        router.
            Methods(route.Method).
            Path(route.Pattern).
            Name(route.Name).
            Handler(route.HandlerFunc)
    }

    if err := http.ListenAndServe(":8080", router); err != nil {
        log.Fatalln(err)
    }
}

// index.go
func init() {
    registerRoute(Route{
        "index",
        "GET",
        "/",
        func(w http.ResponseWriter, r *http.Request) {
            fmt.Fprintf(w, "welcome")
        },
    })
}

// users.go
func init() {
    registerRoute(Route{
        "listUsers",
        "GET",
        "/users",
        listUsers,
    })
}

func listUsers(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "users list")
}

// products.go
func init() {
    registerRoute(Route{
        "listProducts",
        "GET",
        "/products",
        listProducts,
    })
}

func listProducts(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "products list")
}

golang使用此模式,例如
database/sql
image
包。您可以在这里阅读更多关于此的内容:

您可以使用
func init()
。它是一个特殊函数,在程序执行之前,在包初始化期间调用

下面是一个如何使用gorilla/mux路由器实现所需的示例,尽管它可以通过任何其他mux库实现

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/mux"
)

// main.go

type Route struct {
    Name        string
    Method      string
    Pattern     string
    HandlerFunc http.HandlerFunc
}

var routes []Route

func registerRoute(route Route) {
    routes = append(routes, route)
}

func main() {
    router := mux.NewRouter().StrictSlash(false)
    for _, route := range routes {
        router.
            Methods(route.Method).
            Path(route.Pattern).
            Name(route.Name).
            Handler(route.HandlerFunc)
    }

    if err := http.ListenAndServe(":8080", router); err != nil {
        log.Fatalln(err)
    }
}

// index.go
func init() {
    registerRoute(Route{
        "index",
        "GET",
        "/",
        func(w http.ResponseWriter, r *http.Request) {
            fmt.Fprintf(w, "welcome")
        },
    })
}

// users.go
func init() {
    registerRoute(Route{
        "listUsers",
        "GET",
        "/users",
        listUsers,
    })
}

func listUsers(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "users list")
}

// products.go
func init() {
    registerRoute(Route{
        "listProducts",
        "GET",
        "/products",
        listProducts,
    })
}

func listProducts(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "products list")
}
golang使用此模式,例如
database/sql
image
包。你可以在这里多读一点:

如果(我不确定)我理解你的问题,那么
func init()
就是你要找的。如果(我不确定)我理解你的问题,那么
func init()
就是你要找的。