Golang中如何使用Gin将query_time作为变量打印

Golang中如何使用Gin将query_time作为变量打印 我希望前端能显示请求处理所花费的时间。

目前我这样做:

t_start := time.Now()
t_end := time.Since(t_start)

然后我将其作为变量传递给模板。 但由于我使用 Gin,它每次都会记录所有内容并附带精确的时间,我很想从 Gin 获取查询时间并将其传递给模板。

我想这样做有两个原因:

  1. 不让 Go 重复做同样的事情。
  2. 获得更精确的时间,因为当我比较时间时,我自己计算的时间有点偏差,不够精确。
  3. 渲染模板的时间不包括在内。

有没有一种简单的方法,比如将 Gin 记录器的时间存储在一个变量中,我可以在 c.HTML(200, "main.html", p) 之前访问它,以便将其作为变量传递?

先谢谢了!


更多关于Golang中如何使用Gin将query_time作为变量打印的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中如何使用Gin将query_time作为变量打印的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Gin框架中,可以通过自定义中间件来获取并传递查询时间。Gin的Logger中间件已经计算了请求处理时间,但你可以创建自己的版本来存储这个值。以下是实现方案:

package main

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

// 自定义中间件来捕获查询时间
func QueryTimeMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        // 开始时间
        start := time.Now()
        
        // 处理请求
        c.Next()
        
        // 计算耗时
        latency := time.Since(start)
        
        // 将查询时间存储到Context中,供后续使用
        c.Set("query_time", latency)
        
        // 可选:记录日志
        fmt.Printf("请求处理时间: %v\n", latency)
    }
}

func main() {
    r := gin.Default()
    
    // 使用自定义中间件
    r.Use(QueryTimeMiddleware())
    
    r.GET("/", func(c *gin.Context) {
        // 从Context中获取查询时间
        if queryTime, exists := c.Get("query_time"); exists {
            // 将查询时间传递给模板
            c.HTML(200, "index.html", gin.H{
                "query_time": queryTime,
            })
        } else {
            c.HTML(200, "index.html", gin.H{
                "query_time": "N/A",
            })
        }
    })
    
    r.Run(":8080")
}

如果你需要更精确的时间测量(不包括模板渲染时间),可以在中间件中提前计算:

func QueryTimeMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        start := time.Now()
        
        // 使用c.Next()前的处理
        c.Next()
        
        // 在模板渲染前计算时间
        latency := time.Since(start)
        c.Set("query_time", latency)
    }
}

// 然后在处理函数中
r.GET("/page", func(c *gin.Context) {
    // 业务逻辑处理...
    
    // 获取查询时间
    queryTime, _ := c.Get("query_time")
    
    // 传递给模板
    c.HTML(200, "page.html", gin.H{
        "data":       yourData,
        "query_time": queryTime,
    })
})

对于模板中的使用,在HTML模板中可以直接显示:

<!-- template.html -->
<!DOCTYPE html>
<html>
<body>
    <div>请求处理时间: {{.query_time}}</div>
</body>
</html>

如果你需要格式化时间显示:

// 在传递到模板前格式化
formattedTime := fmt.Sprintf("%.2f ms", float64(latency.Nanoseconds())/1000000)
c.Set("query_time", formattedTime)

这样就能准确获取Gin处理请求的时间(不包括模板渲染时间),并将其传递给前端显示。

回到顶部