MST

星途 面试题库

面试题:Go语言中闭包在简单Web服务器场景的应用

假设你要使用Go语言构建一个简单的Web服务器,在处理HTTP请求的函数中如何运用闭包来实现记录每个请求的访问时间,并给出一个简单的示例代码。
17.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 使用闭包记录请求访问时间的原理
    • 闭包可以捕获并保留其定义时的环境变量。在Web服务器处理HTTP请求的场景中,我们可以利用闭包来捕获并记录每个请求的访问时间。
  2. 示例代码
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并打印相关信息。这样就利用闭包实现了记录每个请求的访问时间。