在 Go 中将路由注册到中心对象
Registering Routes to Central Object in Go
我正在使用 Mux 开发一个简单的 Go REST API。我发现的大多数教程都建议按如下方式创建路由器:
- 一个
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
包。您可以在这里阅读更多相关信息:https://www.calhoun.io/why-we-import-packages-we-dont-actually-use-in-golang/
我正在使用 Mux 开发一个简单的 Go REST API。我发现的大多数教程都建议按如下方式创建路由器:
- 一个
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
包。您可以在这里阅读更多相关信息:https://www.calhoun.io/why-we-import-packages-we-dont-actually-use-in-golang/