1、defer 延迟函数

使用 defer 的最常见场景是在函数调用结束后完成一些收尾工作,例如在 defer 中回滚数据库的事务:

1
2
3
4
5
6
7
8
9
10
func createPost(db *gorm.DB) error {
tx := db.Begin()
defer tx.Rollback()

if err := tx.Create(&Post{Author: "Draveness"}).Error; err != nil {
return err
}

return tx.Commit().Error
}

在使用数据库事务时,我们可以使用上面的代码在创建事务后就立刻调用 Rollback 保证事务一定会回滚。哪怕事务真的执行成功了,那么调用 tx.Commit() 之后再执行 tx.Rollback() 也不会影响已经提交的事务。

defer 关键字会在函数返回之前运行。

2、panic 崩溃函数

panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码,并在当前 Goroutine 中递归执行调用方的 defer;

3、recover 恢复函数

recover 可以中止 panic 造成的程序崩溃。它是一个只能在 defer 中发挥作用的函数,在其他作用域中调用不会发挥作用;