上一节:前端程序员学习 Golang gin 框架实战笔记之二分析 context
1. Logger
我把上一节 main.go
的代码换了:
gin.New()
换成了 gin.Default()
上一节我们说过,Default
多了两个中间件:
// Default returns an Engine instance with the Logger and Recovery middleware already attached.
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New()
engine.Use(Logger(), Recovery())
return engine
}
Logger
这个好理解,你用 postman 访问后,是这样的:
在终端上多了一个输出的日志显示。
它可以点开看它的代码的,它就返回了一个中间件:
有一个 c.Next()
值得注意,其他语言也是有这个类似的方法,表示传给下个中间件处理,以后我们自己写中间件,就要用它。
最后它只是一个输出语句。
2. Recovery
Recovery 这个中间件呢?
这里要讲到两个关键词 panic 和 recover。
下面引用网上大佬的解释:
有点晦涩。
我来解释下:
panic 你可以理解成 js 或 java 的 throw ,但又不一样,它表示的是中断运行。
看下这个:
func main() {
defer println("in main")
go func() {
defer println("in goroutine")
panic("")
}()
println("after main")
time.Sleep(1 * time.Second)
}
在协程中,panic 就立马中断了后面的执行,但又会执行它自己的 defer。
最后这个 defer println("in main")
是没有执行的。
我们把它改一下:
func main() {
defer fmt.Println("in main")
go func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered: Error:\n", r)
}
}()
panic("a problem occurred")
}()
fmt.Println("after main")
time.Sleep(1 * time.Second)
}
结果是这样的:
你要在 defer 里调 recover 恢复中断的程序。
我们这个中间件做的事跟这个就有些类似:
你可以试下:
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
panic("not implemented")
c.JSON(http.StatusOK, gin.H{
"message": "Hello World!",
})
})
r.Run()
}
加了中间件,访问后,结果是这样的:
它这里是把日志相当于捕获到并显示在终端上,以后我们还可以自定义这个中间件,把日志记录到文件中。
标签:defer,recovery,中间件,Golang,func,gin,main,panic From: https://www.cnblogs.com/hfpp2012/p/16767981.html