路由器模式 (Router Pattern)
在 Go 语言中,路由器模式(Router Pattern)指的是一种将 URL 路径与相应的处理函数进行映射的设计模式。通过路由器模式,我们可以实现基于 URL 路径的请求分发,将不同的请求路由到不同的处理函数中进行处理。
下面是一个简单的使用路由器模式的示例:
package main
import (
"fmt"
"net/http"
)
// Router 定义一个路由器结构体
type Router struct {
handlers map[string]http.HandlerFunc
}
// NewRouter 创建一个新的路由器实例
func NewRouter() *Router {
return &Router{
handlers: make(map[string]http.HandlerFunc),
}
}
// HandleFunc 向路由器中添加新的处理函数
func (r *Router) HandleFunc(path string, handler http.HandlerFunc) {
r.handlers[path] = handler
}
// 实现 http.Handler 接口,用于处理请求
func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
// 从 handlers 字段中查找当前请求路径对应的处理函数
handler, ok := r.handlers[req.URL.Path]
if !ok {
// 如果找不到,则返回 404 错误
http.NotFound(w, req)
return
}
// 否则,直接调用相应的处理函数来处理当前请求
handler(w, req)
}
// 处理 "/" 路径的请求
func homeHandler(w http.ResponseWriter, r *http.Request) {
if _, err := fmt.Fprint(w, "Welcome to the home page!"); err != nil {
return
}
}
// 处理 "/about" 路径的请求
func aboutHandler(w http.ResponseWriter, r *http.Request) {
if _, err := fmt.Fprint(w, "Learn more about us!"); err != nil {
return
}
}
// 处理 "/contact" 路径的请求
func contactHandler(w http.ResponseWriter, r *http.Request) {
if _, err := fmt.Fprint(w, "Get in touch with us!"); err != nil {
return
}
}
func main() {
// 创建一个新的路由器实例
router := NewRouter()
// 将不同的 URL 路径与相应的处理函数进行映射
router.HandleFunc("/", homeHandler)
router.HandleFunc("/about", aboutHandler)
router.HandleFunc("/contact", contactHandler)
// 启动服务器,并将路由器实例作为参数传入
err := http.ListenAndServe(":8080", router)
if err != nil {
fmt.Println("Failed to start server:", err)
}
}
在上面的示例中,我们定义了一个 Router
结构体,其中包含一个 handlers
字段。它是一个 map
类型,用于存储 URL 路径与处理函数之间的映射关系。我们可以通过调用 NewRouter
函数创建一个新的路由器实例。使用 HandleFunc
方法可以向路由器添加新的处理函数。
在 main
函数中,我们创建了一个新的路由器实例,然后使用 HandleFunc
方法将不同的 URL 路径与相应的处理函数进行映射。最后,我们通过调用 http.ListenAndServe
函数来启动服务器,并将路由器实例作为参数传入。在 ServeHTTP
方法中,我们首先从 handlers
字段中查找当前请求路径对应的处理函数。如果找不到,则返回 404 错误。否则,我们就直接调用相应的处理函数来处理当前请求。
上面的示例只是一个非常简单的使用路由器模式的示例。在实际应用中,我们可能需要实现更复杂的路由匹配规则,支持参数化路径、中间件等功能。但是,了解基本的路由器模式原理之后,我们就可以很方便地实现自己的路由器,从而实现基于 URL 路径的请求分发。
推荐文章: