Golang 自己写个重试方法
包装类
package helper
import (
"fmt"
"sync"
)
type RetryHelper struct {
}
var instance *RetryHelper
var once sync.Once
func GetRetryHelperInstance() *RetryHelper {
once.Do(func() {
instance = &RetryHelper{}
})
return instance
}
// Run
// @Description: 方法重试
// @receiver helper
// @param count 重试次数,如果count<=0 则不进行重试
// @param id 任务标注,string
// @param handler 隐匿方法,如需重试请返回 err 且 err!=nil
// @return err 多次重试后,如果handler还是返回 err,则返回该 err
//
func (*RetryHelper) Run(count int, id string, handler func() error) (err error) {
defer func() {
}()
//第一次正常执行
err = handler()
if err != nil && count > 0 { //发现第一次执行失败,不处理panic
for i := 0; i < count; i++ {
if err = handler(); err != nil {
fmt.Println(fmt.Sprintf("任务序列%s第%d次重试执行失败。message= %s", id, i+1, err.Error()))
} else {
break
}
}
}
return err
}
使用
package test
import (
"errors"
"fmt"
"hello/src/helper"
"testing"
)
func TestRetry(t *testing.T) {
var a int = 1
var b int = 9
var c int
err := helper.GetRetryHelperInstance().Run(4, "test", func() error {
c = a + b
return errors.New("number is Error")
})
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(c)
}
用法有点像是C# 中的 lambda匿名方法

浙公网安备 33010602011771号