diff --git a/utils/super/f.go b/utils/super/f.go new file mode 100644 index 0000000..d5fe698 --- /dev/null +++ b/utils/super/f.go @@ -0,0 +1,23 @@ +package super + +// Handle 执行 f 函数,如果 f 为 nil,则不执行 +func Handle(f func()) { + if f != nil { + f() + } +} + +// HandleErr 执行 f 函数,如果 f 为 nil,则不执行 +func HandleErr(f func() error) error { + if f != nil { + return f() + } + return nil +} + +// HandleV 执行 f 函数,如果 f 为 nil,则不执行 +func HandleV[V any](v V, f func(v V)) { + if f != nil { + f(v) + } +} diff --git a/utils/super/retry.go b/utils/super/retry.go new file mode 100644 index 0000000..17f5d88 --- /dev/null +++ b/utils/super/retry.go @@ -0,0 +1,32 @@ +package super + +import "time" + +// Retry 根据提供的 count 次数尝试执行 f 函数,如果 f 函数返回错误,则在 interval 后重试,直到成功或者达到 count 次数 +func Retry(count int, interval time.Duration, f func() error) error { + var err error + for i := 0; i < count; i++ { + if err = f(); err == nil { + return nil + } + time.Sleep(interval) + } + return err +} + +// RetryAsync 与 Retry 类似,但是是异步执行 +// - 传入的 callback 函数会在执行完毕后被调用,如果执行成功,则 err 为 nil,否则为错误信息 +// - 如果 callback 为 nil,则不会在执行完毕后被调用 +func RetryAsync(count int, interval time.Duration, f func() error, callback func(err error)) { + go func() { + var err error + for i := 0; i < count; i++ { + if err = f(); err == nil { + HandleV(nil, callback) + return + } + time.Sleep(interval) + } + HandleV(err, callback) + }() +}