面试题答案
一键面试- 使用闭包记录请求访问时间的原理:
- 闭包可以捕获并保留其定义时的环境变量。在Web服务器处理HTTP请求的场景中,我们可以利用闭包来捕获并记录每个请求的访问时间。
- 示例代码:
package main
import (
"fmt"
"net/http"
"time"
)
func loggingHandler(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
// 记录开始时间
fmt.Printf("Request received at %v for %s\n", start, r.URL.Path)
next.ServeHTTP(w, r)
// 处理请求
elapsed := time.Since(start)
// 计算时间差
fmt.Printf("Request for %s completed in %v\n", r.URL.Path, elapsed)
})
}
func main() {
http.Handle("/", loggingHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
})))
fmt.Println("Server is running on http://localhost:8080")
http.ListenAndServe(":8080", nil)
}
在上述代码中:
loggingHandler
函数是一个中间件,它接受一个http.Handler
类型的参数next
。- 在
loggingHandler
返回的http.HandlerFunc
闭包中,使用time.Now()
获取请求开始时间start
,然后调用next.ServeHTTP(w, r)
处理请求,最后计算请求处理完成的时间差elapsed
并打印相关信息。这样就利用闭包实现了记录每个请求的访问时间。