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匿名方法