go实现业务回滚(defer妙用之一)
最近在用GO重写本组的OSS系统,需要实现业务的回滚功能(即一个流程中,先与A进行交互,然后再与B进行交互,如果B失败了,回滚与A交互的逻辑这样)。另外,在初始化的时候也经常需要在任何一个模块初始化失败的时候回滚其他模块
太长不看版
defer是延时调用函数,在函数退出之时会进行调用,而且defer函数的调用顺序也是先调用的后执行,故defer其功能上就比较适合进行回滚。
总体思路便是一个初始化函数执行ok后,使用defer对应其回退函数,回退函数中会对error进行判断,若error不为空,则说明是异常退出,进行回退;若error是空,则说明是正常退出函数,不需要进行回退。(这部分逻辑在闭包函数中实现)
这里以函数的初始化作为demo
package main
import "fmt"
import "errors"
func helloWolrd() (err error) {
rollback := func(rollback func()) {
if err != nil {
rollback()
}
}
err = initA()
if err != nil {
return err
}
defer rollback(rollbackInitA)
err = initB()
if err != nil {
return err
}
defer rollback(rollbackInit