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