在 Go 中将路由注册到中心对象

Registering Routes to Central Object in Go

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

我宁愿使用不同的模型:

我不知道该怎么做,因为它似乎需要为每个文件创建一个初始化函数并从 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/sqlimage 包。您可以在这里阅读更多相关信息:https://www.calhoun.io/why-we-import-packages-we-dont-actually-use-in-golang/