Go-路由基础与多路复用

1. 路由基础

在 Go 中,可以使用 net/http 包来设置基本的路由。可以通过 http.HandleFunc 注册 URL 路径和处理函数,从而实现不同路径的请求处理。

基本路由示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main

import (
"fmt"
"net/http"
)

func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
}

func main() {
http.HandleFunc("/", helloHandler)
fmt.Println("服务器启动,监听端口 8080")
http.ListenAndServe(":8080", nil)
}

在上面的代码中,/ 路径会匹配所有的请求,并执行 helloHandler 函数的处理逻辑。

2. HTTP 请求路由

为了实现更加复杂的路由和请求处理,可以使用一些 HTTP 路由库,如 gorilla/mux,它允许我们设置参数化路径、正则匹配等高级功能。

使用 gorilla/mux 路由库

安装 gorilla/mux 路由库:

1
go get -u github.com/gorilla/mux

gorilla/mux 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

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

func main() {
r := mux.NewRouter()
r.HandleFunc("/users/{id}", userHandler).Methods("GET")
r.HandleFunc("/products/{category}/{id:[0-9]+}", productHandler).Methods("GET")

fmt.Println("服务器启动,监听端口 8080")
http.ListenAndServe(":8080", r)
}

func userHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id := vars["id"]
fmt.Fprintf(w, "用户ID: %s", id)
}

func productHandler(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
category := vars["category"]
id := vars["id"]
fmt.Fprintf(w, "分类: %s, 产品ID: %s", category, id)
}

在上述示例中,mux 库允许我们使用动态路由,例如用户 ID 和产品分类,方便管理多种 API 路由。

3. 多路复用(Multiplexing)

在网络编程中,多路复用用于管理和调度多个 I/O 操作。Go 标准库的 net/http 包自带了基本的多路复用功能,允许我们在一个服务器上处理多种请求类型。

Go 中的多路复用

net/http 包自动处理多路复用,它会为每个连接创建一个 goroutine,从而实现并发处理请求。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"fmt"
"net/http"
)

func homeHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "欢迎来到首页!")
}

func aboutHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "关于我们页面")
}

func main() {
http.HandleFunc("/", homeHandler)
http.HandleFunc("/about", aboutHandler)

fmt.Println("服务器启动,监听端口 8080")
http.ListenAndServe(":8080", nil)
}

在上述代码中,http.HandleFunc 处理多个路由,net/http 包会自动对请求进行多路复用。

4. 其他高级路由和多路复用库

  • Gin:一个轻量级的 HTTP web 框架,带有内置的路由和多路复用功能。
  • httprouter:一个高性能路由库,支持高效的 URL 路径匹配。

使用 Gin 框架

安装 Gin:

1
go get -u github.com/gin-gonic/gin

Gin 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main

import (
"github.com/gin-gonic/gin"
)

func main() {
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
router.Run(":8080")
}

Gin 提供了更多功能和优化,适合构建高效的 Web API 服务。