From ee87612f60ccecade532a1345e157147597a3540 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Wed, 5 Jul 2023 13:39:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E5=8F=8A=E4=B8=A4=E4=B8=AA=E5=85=B3=E4=BA=8E?= =?UTF-8?q?=20func=20=E6=89=A7=E8=A1=8C=E7=9A=84=E8=BE=85=E5=8A=A9?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 支持通过 super.Handle 和 super.HandleV 对函数进行执行,如果传入的函数不为 nil 则会执行 --- utils/super/f.go | 23 +++++++++++++++++++++++ utils/super/retry.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 utils/super/f.go create mode 100644 utils/super/retry.go 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) + }() +}