在 Go 语言中,Router.HandleFunc
是用于注册 HTTP 路由和处理函数的常见方法(通常来自 net/http
或第三方库如 gorilla/mux
)。以下是详细说明和示例:
1. 标准库 net/http
的用法
package main
import (
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, World!"))
}
func main() {
// 创建路由器
router := http.NewServeMux()
// 注册路由和处理函数
router.HandleFunc("/hello", helloHandler)
// 启动服务器
http.ListenAndServe(":8080", router)
}
- 作用:将路径
/hello
绑定到helloHandler
函数。 - 特点:
- 内置标准库,无需额外依赖。
- 仅支持基于路径的匹配,不支持动态路由、正则表达式等高级特性。
2. 第三方库 gorilla/mux
的用法
package main
import (
"net/http"
"github.com/gorilla/mux"
)
func userHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
w.Write([]byte("User ID: " + vars["id"]))
}
func main() {
r := mux.NewRouter()
// 注册路由(支持动态参数)
r.HandleFunc("/users/{id:[0-9]+}", userHandler)
http.ListenAndServe(":8080", r)
}
- 优势:
- 动态路由:如
/users/{id}
,支持正则约束(如{id:[0-9]+}
)。 - HTTP方法匹配:可通过
Methods("GET")
指定请求方法。
- 动态路由:如
- 安装:
go get github.com/gorilla/mux@v1.8.0
3. Gin框架的类似实现
若使用高性能框架 Gin,对应的方法是 router.GET/POST
:
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/hello", func(c *gin.Context) {
c.String(200, "Hello, Gin!")
})
r.Run(":8080")
}
关键区别
Feature | net/http |
gorilla/mux |
Gin |
---|---|---|---|
动态路由 | ❌ | ✅ | ✅ |
HTTP方法过滤 | ❌ | ✅ | ✅ |
性能 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
中间件支持 | ❌ | ✅ | ✅ |
常见问题
- 如何获取查询参数? “`go // net/http id := r.URL.Query().Get(“id”)
// gorilla/mux (路径参数) vars := mux.Vars® id := vars[“id”]
2. **如何添加中间件?**
```go
// gorilla/mux
r.Use(loggingMiddleware)
- 如何匹配所有路径?
r.PathPrefix("/").HandlerFunc(catchAllHandler)
如果需要更复杂的路由功能(如分组、中间件链),推荐使用 Gin、Echo 或 Fiber。
内容由零声教学AI助手提供,问题来源于学员提问