| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 | package retryimport (	"errors"	"time")var (	errorRetryFailed = errors.New("All retry attempts failed."))// Strategy is a way to retry on a specific function.type Strategy interface {	// On performs a retry on a specific function, until it doesn't return any error.	On(func() error) error}type retryer struct {	NextDelay func(int) int}// On implements Strategy.On.func (r *retryer) On(method func() error) error {	attempt := 0	for {		err := method()		if err == nil {			return nil		}		delay := r.NextDelay(attempt)		if delay < 0 {			return errorRetryFailed		}		<-time.After(time.Duration(delay) * time.Millisecond)		attempt++	}}// Timed returns a retry strategy with fixed interval.func Timed(attempts int, delay int) Strategy {	return &retryer{		NextDelay: func(attempt int) int {			if attempt >= attempts {				return -1			}			return delay		},	}}
 |