本篇是mygin的第七篇,参照gin框架,感兴趣的可以从 Mygin第一篇 开始看,Mygin从零开始完全手写,在实现的同时,带你一窥gin框架的核心原理实现。
目的
- 中间件Middleware优化
- 默认log日志中间件
在上篇服务器托管网 Mygin实现中间件Middleware 中间件Middleware很生硬,完全依赖循环,如果某个中间件想要cover住全部中间件,比如我想记录,整个请求的耗时时间,以便针对优化的功能。因此需要把之前生硬的方式做一些修改。
修改
1.实例化上下文修改
//实例化一个下上文
c := &Context{
Request: r,
Writer: w,
Params: params,
handlers: handlers,
index: -1, //默认下标为-1
}
2.修改上下文Next方法
// Next 执行链中的剩余处理程序。
func (c *Context) Next() {
c.index++
//遍历handlers
for c.index
日志
参照(复制)gin中的写法,新建mygin/logger.go日志中间件文件。
- mygin/logger.go
package mygin
import (
"fmt"
"net/http"
"time"
)
const (
green = "33[97;42m" // 绿色
white = "33[90;47m" // 白色
yellow = "33[90;43m" // 黄色
red = "33[97;41m" // 红色
blue = "33[97;44m" // 蓝色
magenta = "33[97;45m" // 洋红色
cyan = "33[97;46m" // 青色
reset = "33[0m" // 重置颜色
)
type LogFormatterParams struct {
}
// MethodColor 方法颜色获取
func (l *LogFormatterParams) MethodColor(method string) string {
switch method {
case http.MethodGet:
return blue
case http.MethodPost:
return cyan
case http.MethodPut:
return yellow
case http.MethodDelete:
return red
case http.MethodPatch:
return green
case http.MethodHead:
return magenta
case http.MethodOptions:
return white
default:
return reset
}
}
// StatusCodeColor 状态颜色获取
func (l *LogFormatterParams) StatusCodeColor(code int) string {
switch {
case code >= http.StatusOK && code = http.StatusMultipleChoices && code = http.StatusBadRequest && code
日志中间件
测试
测试代码
package mygin
import (
"net/http"
"path"
"testing"
)
func TestMyGin06(t *testing.T) {
r := Default()
r.Use()
//测试需要登录
group := r.Group("/api", func(context *Context) {
//todo....
context.String(http.StatusOK, "api Group 中间件失败了....n")
context.Abort()
})
group.Use()
//这个回调不会执行
group.GET("/hello/:name", func(context *Context) {
name := context.Params.ByName("name")
context.String(http.StatusOK, path.Join("hello ", name, "!"))
})
//测试没有发生Abort
group2 := r.Group("/api2", func(context *Context) {
//todo....
context.String(http.StatusOK, "api Group 中间件成功了....n")
})
//这个回调会执行
group2.GET("/hello2/:name", func(context *Context) {
name := context.Params.ByName("name")
context.String(http.StatusOK, path.Join("hello2 ", name, "!n"))
})
// 启动服务器并监听端口
r.Run(":8088")
}
启动测试
go test
curl请求测试
curl -i http://localhost:8088/api2/hello2/scott
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 30 Jan 2024 06:56:03 GMT
Content-Length: 49
api Group 中间件成功了....
hello2 /scott/!
➜ ~ curl -i http://localhost:8088/api/hello/scott
H服务器托管网TTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Date: Tue, 30 Jan 2024 06:56:26 GMT
Content-Length: 33
api Group 中间件失败了....
查看控制台输出
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
基于梯度算法的无人机航迹规划 文章目录 基于梯度算法的无人机航迹规划 1.梯度搜索算法 2.无人机飞行环境建模 3.无人机航迹规划建模 4.实验结果 4.1地图创建 4.2 航迹规划 5.参考文献 6.Matlab代码 摘要:本文主要介绍利用梯度算法来优化无人…