在go语言的开发中,我们要中断当前代码执行 可以使用 return 语句来中断当前代码的执行。 return 语句中断的是当前函数的代码执行。 在gin框架中,如果要中断当前的网络请求,有2种方法。
1. Abort() 方法 + return 语句
在gin框架中,要中断当前网络请求,需要使用 Abort() 方法+return语句才能实现。
return 语句 中断当前的代码块执行; gin上下文中的Abort()方法 中的后续的gin网络请求。
c gin.Context 控制器上下文中的网络请求中断示例:
func (a *xxx) Hello(c *gin.Context) {
age:= c.QueryInt("age")
if age<18 {
c.JSON(200,&gin.H{"msg":"Sorry, 少儿不宜!"})
return // 直接中断当前网络请求, 这里必须使用return 返回,否则后面的代码还会被执行
}
if age>18 {
// 业务逻辑 ......
c.JSON(200,&gin.H{"msg":"Welcome to learn Golang!"})
}
}
在中间件middleware中中断当前网络请求
在gin框架的中间件中,需要中断当前网络请求,必须使用 c.Abort() + return 配合才能中断当前网络请求。
func Logger() gin.HandlerFunc {
return func(c *gin.Context) {
name := c.Query("name")
if name!="root" {
log.Println("You are not authorized to log")
c.Abort() // 中断后续请求
return // 中断当前代码块
}
// 设置 example 变量
c.Set("example", "12345")
// 请求前
c.Next()
// 获取发送的 status
status := c.Writer.Status()
log.Println(status)
}
}
func main() {
r := gin.New()
r.Use(Logger())
r.GET("/test", func(c *gin.Context) {
example := c.MustGet("example").(string)
// 打印:"12345"
log.Println(example)
})
// 监听并在 0.0.0.0:8080 上启动服务
r.Run(":8080")
}
2. 使用panic函数直接抛异常方式中断当前网络请求
在go语言中,panic
语句用于触发一个运行时错误,立即停止当前函数的执行,并开始回溯调用栈,直到遇到recover
或程序终止。
这个panic函数可谓是无敌级别的请求中断语句,他可中断任何的代码,不管你是在中间件中还是在控制器中, 只要他被执行,在它后面的代码都会被立即终止执行。
示例: 下面这个函数,不管你在任何地方,只要调用了这个函数,当前函数所在后面的任何代码都不会被执行。
// 中断当前请求
func ReqExit(msg string) {
panic(msg)
}
总结:gin框架中要中断当前请求并返回可以调用gin上下文中的内容输出相关方法,如JSON()方法, 不过需要注意这个方法调用后,他后面的代码还会被执行,除非你执行return或者 panic语句。
gin相关源码 参考
func (c *Context) JSON(code int, obj any) {
c.Render(code, render.JSON{Data: obj})
}
// Render writes the response headers and calls render.Render to render data.
func (c *Context) Render(code int, r render.Render) {
c.Status(code)
if !bodyAllowedForStatus(code) {
r.WriteContentType(c.Writer)
c.Writer.WriteHeaderNow()
return
}
if err := r.Render(c.Writer); err != nil {
// Pushing error to c.Errors
_ = c.Error(err)
c.Abort()
}
}