go中一个由较多步骤的操作写法
package main
import (
"fmt"
)
var msg string
var err error
func main() {
defer func() {
result := "failed"
if err == nil {
result = "success"
} else {
msg += err.Error()
}
fmt.Printf("结束(%s), msg: %s\n", result, msg)
}()
steps := []func() error{
step1,
step2,
step3,
step4,
step5,
}
failedStep := 0 // 保存失败的步骤索引
for i := failedStep; i < len(steps); i++ {
err = steps[i]()
if err != nil {
fmt.Printf("Step %d failed: %v\n", i+1, err)
failedStep = i // 更新失败的步骤索引
break
}
}
fmt.Println("failedStep:", failedStep)
}
func step1() error {
msg += "Step 1 "
return nil
}
func step2() error {
msg += "Step 2 "
return nil
}
func step3() error {
msg += "Step 3 "
return fmt.Errorf("test step failed 3")
//return nil
}
func step4() error {
msg += "Step 4 "
return nil
}
func step5() error {
msg += "Step 5"
return nil
}
此写法优点
- 统一处理结果(正常和异常), 方便记录任务整体日志以及每个环节的日志
- 步骤写在一起,逻辑清晰
- 支持指定第几步开始运行,方便进行重试逻辑
要求
- 每个步骤的func需要是统一的参数和返回值
- 共享的信息需要提前创建和设置OK