lodashやunderscoreにあるthrottle
が好きだったのですがGoで同じような実装をしようと思うと面倒だったり、見通しが悪くなりそうだったので新しくLibraryを作成しました。
https://github.com/yudppp/throttle
type Throttler interface {
Do(f func())
}
上記のようなinterfaceで定義しました。 interfaceとしては似たような動きをするsync.Once
と同じ形にしています。
example
package throttle_test
import (
"testing"
"time"
"github.com/yudppp/throttle"
)
func TestThrottle(t *testing.T) {
throttler := throttle.New(time.Second)
for i := 0; i < 10; i++ {
throttler.Do(func() {
cnt++
})
}
if cnt != 1 {
t.Errorf("cnt should be 1, but %d", cnt)
}
}
こんな感じで1秒間に何回も実行されえてもDoの引数の関数は一度しか呼ばれないようになっています。