### 设置router时，传递多个HandlerFunc

```go

// HandlerFunc defines the handler used by gin middleware as return value.
type HandlerFunc func(*Context)
```



在 Go 语言的 Gin Web 框架中，设置路由时传递多个 `HandlerFunc` 的目的是为了实现中间件机制。中间件是指在处理请求的过程中，能够在请求到达最终处理函数之前或响应返回客户端之前，对请求和响应进行预处理或后处理的一些函数。

### 中间件的用途

中间件可以用于多种场景，包括但不限于：

1. **日志记录**：记录每个请求的详细信息，如请求路径、方法、处理时间等。
2. **认证与授权**：检查用户是否已登录，是否有权限访问某些资源。
3. **错误处理**：捕获和处理请求处理过程中的错误，返回统一的错误响应。
4. **请求修改**：在请求到达最终处理函数之前，对请求进行修改，如解析和验证请求参数。
5. **响应处理**：在响应返回给客户端之前，对响应进行修改，如添加响应头、格式化响应数据等。

### 示例

例如，你可以定义一个简单的中间件来记录请求的处理时间：

```go
package main

import (
	"log"
	"time"

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

// 定义一个中间件函数
func LoggerMiddleware(c *gin.Context) {
	start := time.Now()
	c.Next() // 处理请求

	// 请求处理完成后执行以下代码
	duration := time.Since(start)
	log.Printf("Request processed in %v", duration)
}

func main() {
	r := gin.Default()

	// 使用中间件
	r.GET("/ping", LoggerMiddleware, func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})

	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
```

在这个例子中，`LoggerMiddleware` 是一个中间件函数，它会记录每个请求的处理时间。`c.Next()` 用于调用下一个中间件或最终的处理函数。

### 使用多个中间件

你可以传递多个 `HandlerFunc` 来设置多个中间件。例如，假设你有两个中间件，一个用于日志记录，一个用于认证：

```go
func AuthMiddleware(c *gin.Context) {
	// 这里进行认证逻辑
	token := c.GetHeader("Authorization")
	if token != "valid-token" {
		c.JSON(401, gin.H{"error": "Unauthorized"})
		c.Abort() // 终止请求的进一步处理
		return
	}
	c.Next()
}

func main() {
	r := gin.Default()

	// 使用多个中间件
	r.GET("/secure", LoggerMiddleware, AuthMiddleware, func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "secure data",
		})
	})

	r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
```

在这个例子中，`LoggerMiddleware` 和 `AuthMiddleware` 会按顺序执行，然后再执行最终的处理函数。如果认证失败，中间件会终止请求处理并返回 401 错误。

### 总结

在 Gin 中传递多个 `HandlerFunc` 是为了实现中间件机制，中间件可以在请求处理的不同阶段执行特定的逻辑，从而提供更好的代码组织和复用性。中间件在处理请求时按照传递的顺序依次执行，`c.Next()` 用于调用下一个中间件或最终处理函数。