Golang正则表达式路由实现

如何在Golang中实现基于正则表达式的路由功能?想请教一下具体的实现方法,比如如何用正则匹配URL路径,处理动态参数,以及如何和现有的路由框架结合。最好能提供一些示例代码或性能优化的建议。

2 回复

Golang中可使用regexp包实现正则路由。结合http.ServeMux或第三方路由库(如gorilla/mux),通过正则匹配URL路径,实现动态路由和参数提取。示例:r.HandleFunc("/user/{id:[0-9]+}", handler)

更多关于Golang正则表达式路由实现的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中,可以使用正则表达式实现灵活的路由匹配。以下是两种常见实现方式:

1. 使用标准库 regexp

package main

import (
    "net/http"
    "regexp"
)

type Route struct {
    Pattern *regexp.Regexp
    Handler http.HandlerFunc
    Methods []string // GET, POST等
}

type Router struct {
    routes []Route
}

func (r *Router) AddRoute(pattern string, handler http.HandlerFunc, methods ...string) {
    compiled := regexp.MustCompile(pattern)
    r.routes = append(r.routes, Route{
        Pattern: compiled,
        Handler: handler,
        Methods: methods,
    })
}

func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
    for _, route := range r.routes {
        if route.Pattern.MatchString(req.URL.Path) {
            // 检查HTTP方法
            if len(route.Methods) > 0 {
                methodMatch := false
                for _, method := range route.Methods {
                    if req.Method == method {
                        methodMatch = true
                        break
                    }
                }
                if !methodMatch {
                    continue
                }
            }
            
            route.Handler(w, req)
            return
        }
    }
    http.NotFound(w, req)
}

// 使用示例
func main() {
    router := &Router{}
    
    // 匹配 /user/123
    router.AddRoute(`^/user/(\d+)$`, userHandler, "GET")
    
    // 匹配 /product/category/electronics
    router.AddRoute(`^/product/category/(\w+)$`, categoryHandler)
    
    http.ListenAndServe(":8080", router)
}

func userHandler(w http.ResponseWriter, r *http.Request) {
    // 从URL中提取参数
    matches := regexp.MustCompile(`^/user/(\d+)$`).FindStringSubmatch(r.URL.Path)
    if len(matches) > 1 {
        userID := matches[1]
        w.Write([]byte("User ID: " + userID))
    }
}

2. 使用第三方库 gorilla/mux(推荐)

package main

import (
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()
    
    // 使用正则约束
    r.HandleFunc("/user/{id:[0-9]+}", userHandler).Methods("GET")
    r.HandleFunc("/product/{category:[a-z]+}", categoryHandler)
    r.HandleFunc("/article/{year:[0-9]{4}}/{month:[0-9]{2}}", articleHandler)
    
    http.ListenAndServe(":8080", r)
}

func userHandler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    id := vars["id"]
    w.Write([]byte("User ID: " + id))
}

func categoryHandler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    category := vars["category"]
    w.Write([]byte("Category: " + category))
}

关键要点

  1. 正则模式:使用 {name:regex} 格式定义带约束的参数
  2. 方法限制:通过 .Methods() 指定允许的HTTP方法
  3. 参数提取:使用 mux.Vars(r) 获取路由参数

gorilla/mux 是更推荐的选择,因为它提供了更完善的API、更好的性能和更丰富的功能。

回到顶部