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

posted @ 2022-01-27 10:42  FCmmmmmm  阅读(377)  评论(0编辑  收藏  举报