// @Title 订单修改
// @Description 订单修改
// @Success 200 {object} app.Response
// @router / [put]
func (e *OrderController) Put(c *gin.Context) {
var (
model models.StoreOrder
appG = app.Gin{C: c}
)
httpCode, errCode := app.BindAndValid(c, &model)
if errCode != constant.SUCCESS {
appG.Response(httpCode, errCode, nil)
return
}
orderService := order_service.Order{
M: &model,
}
if err := orderService.Save(); err != nil {
appG.Response(http.StatusInternalServerError, constant.FAIL_ADD_DATA, nil)
return
}
//发送订单变更通知
defer func() {
_, order, err := orderService.GetOrderInfo()
if err != nil {
global.LOG.Error("GetOrderInfo error order_id", orderService.OrderId)
} else {
orderService.M = order
orderService.OrderEvent(orderEnum.OperationUpdate)
}
}()
appG.Response(http.StatusOK, constant.SUCCESS, nil)
}
我的问题:
老师说 用户接口对于时间比较敏感,因此将耗时的操作放到defer中
比如上面的代码:是在appG.Response(http.StatusOK, constant.SUCCESS, nil) 执行了之后 再执行defer函数中的内容吗?我本来也是这么理解的。调用Put方法,收到了200的http状态码,然后再执行defer函数中的内容。
但是:我写了一个例子,发现 只有在defer中的代码执行完成后,这个接口才返回,整个耗时并没有减少呀?
func Response(ctx *gin.Context) {
ctx.JSON(http.StatusOK, gin.H{
"status": "OK",
})
return
}
func Ping(ctx *gin.Context) {
defer func() {
time.Sleep(time.Millisecond * 10)
fmt.Println("deffer......")
}()
Response(ctx)
}
func main() {
engine := gin.Default()
engine.GET("/ping", Ping)
engine.Run(":8765")
}