Golang 自己写个重试方法

包装类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
}

  

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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匿名方法

posted @   FCmmmmmm  阅读(377)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示