使用go语言写一个执行时间中间件,不太明白中间件timeHandler部分的执行过程.

本文介绍如何用Go语言编写一个HTTP中间件,该中间件记录请求的开始和结束时间,以实现对HTTP请求处理时间的监控。通过`timeHandler`函数,它在请求开始时记录时间,并在请求完成后输出处理所花费的时间。这个中间件可以用于优化和调试web服务的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用go语言写一个执行时间中间件,不太明白中间件timeHandler部分的执行过程.

package main

import (
	"fmt"
	"log"
	"net/http"
	"time"
)

func index(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "This is index!")

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

}
//这个不太懂.过程有点难理解
func timeHandler(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		start := time.Now()
		log.Printf("Strated %s %s ", r.Method, r.URL.Path)
		next.ServeHTTP(w, r)
		log.Printf("Completed %s in %v", r.URL.Path, time.Since(start))

	})

}
func asd(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "yaochizaocan")

}

func main() {
	mux := http.NewServeMux()                              //创建一个路由转发器.
	mux.Handle("/asd", timeHandler(http.HandlerFunc(asd))) //将写好的asd函数到写好的timehandler中间件进行注册.
	mux.Handle("/hello", timeHandler(http.HandlerFunc(hello)))
	mux.Handle("/", timeHandler(http.HandlerFunc(index)))
	http.ListenAndServe(":8080", mux)
}

 

Go语言中的接口自动化测试主要是指使用Go语言内置的测试框架编测试用例,来对程序中的各种接口进行自动化测试。Go语言的测试框架简洁且高效,它通常与编待测试的接口代码一起放在同一个包中,以`_test.go`结尾。 编Go语言的接口自动化测试通常需要以下几个步骤: 1.测试函数:测试函数通常以`Test`开头,后接被测试函数的名称,并且接受一个`*testing.T`类型的参数。使用该参数可以报告测试失败,并控制测试过程。 2. 使用测试框架提供的方法:Go的`testing`包提供了很多方法,比如`Error`, `Errorf`, `Fail`, `FailNow`等,用于在测试过程中记录错误和失败。 3. 模拟依赖和环境:对于接口测试,可能需要模拟外部依赖,比如数据库、网络服务等。可以使用接口模拟框架如`testify`的`mock`包或`gomock`来创建这些依赖的模拟对象。 4. 使用`http`包进行HTTP接口测试:如果要测试HTTP接口,可以使用Go的`net/http/httptest`包来创建测试服务器。 以下是一个简单的例子,展示如何编一个HTTP接口的自动化测试: ```go // 假设有一个HTTP处理函数,返回当前时间 package main import ( "encoding/json" "log" "net/http" "time" ) // TimeResponse 是返回的时间结构体 type TimeResponse struct { Time string `json:"time"` } // 时间处理函数 func timeHandler(w http.ResponseWriter, r *http.Request) { currentTime := TimeResponse{Time: time.Now().Format(time.RFC3339)} responseJSON, err := json.Marshal(currentTime) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") w.Write(responseJSON) } func main() { http.HandleFunc("/time", timeHandler) log.Fatal(http.ListenAndServe(":8080", nil)) } ``` 对应的测试代码可能如下: ```go // time_test.go package main import ( "testing" "net/http/httptest" "encoding/json" "net/http" "time" ) // 测试时间处理函数 func TestTimeHandler(t *testing.T) { // 创建一个请求 req, err := http.NewRequest("GET", "/time", nil) if err != nil { t.Fatal(err) } // 创建一个测试服务器 ts := httptest.NewServer(http.HandlerFunc(timeHandler)) defer ts.Close() // 发送请求并获取响应 res, err := http.DefaultClient.Do(req) if err != nil { t.Fatal(err) } defer res.Body.Close() // 解析响应 var tr TimeResponse if err := json.NewDecoder(res.Body).Decode(&tr); err != nil { t.Fatal(err) } // 验证响应是否符合预期 _, err = time.Parse(time.RFC3339, tr.Time) if err != nil { t.Errorf("unexpected time format: %v", tr.Time) } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值