初始化项目

This commit is contained in:
皮蛋13361098506
2025-01-06 16:01:02 +08:00
commit 1b77f62820
575 changed files with 69193 additions and 0 deletions

View File

@@ -0,0 +1,60 @@
package counter_util
import (
"time"
)
// CounterUtil
// @description: 固定窗口计数器辅助类
type CounterUtil struct {
tag string // tag counter标识
num int // num 当前计数
warnNum int // warnNum 警告数量
windowsTime time.Time // windowsTime 窗口时间
checkSameWindowsFun func(t1, t2 time.Time) bool // checkSameWindowsFun 比较是否同一个时间窗口
warnAction func(tag string, num int, t time.Time) // warnAction 监控回调方法
}
// NewCounterUtil
// @description: 构造计数器
// parameter:
// @_tag:tag标识会在WarnAction中传递回来
// @_warnNum:告警数量
// @_checkWindowFun:比较是否同一个时间窗口
// @_warnAction:指定数量触发回调
// return:
// @*CounterUtil:固定窗口计数器辅助类
func NewCounterUtil(_tag string, _warnNum int, _checkWindowFun func(t1, t2 time.Time) bool, _warnAction func(tag string, num int, t time.Time)) *CounterUtil {
r := &CounterUtil{
tag: _tag,
warnNum: _warnNum,
windowsTime: time.Now(),
checkSameWindowsFun: _checkWindowFun,
warnAction: _warnAction,
}
return r
}
// AddNum
// @description: 添加数量
// parameter:
// @receiver c:计数器
// @n:增加的数量
// return:
// @int:计数器当前的数量
func (c *CounterUtil) AddNum(n int) int {
if !c.checkSameWindowsFun(c.windowsTime, time.Now()) {
c.num = 0
c.windowsTime = time.Now()
}
// 增加次数
c.num += n
if c.num >= c.warnNum {
c.warnAction(c.tag, c.num, time.Now())
c.num = 0
}
return c.num
}

View File

@@ -0,0 +1,33 @@
package counter_util
import (
"fmt"
"testing"
"time"
)
func TestInfoLog(t *testing.T) {
var iserr bool = true
c := NewCounterUtil("test", 2, checkId, func(tag string, num int, ti time.Time) {
msg := fmt.Sprintf("tag:%s 当前数量为num:%v ti:%v", tag, num, ti)
if iserr {
t.Error(msg)
} else {
t.Log(msg)
}
})
c.AddNum(1)
iserr = false
c.AddNum(1)
time.Sleep(time.Second * 1)
iserr = true
c.AddNum(1)
time.Sleep(time.Second * 1)
c.AddNum(1)
}
func checkId(t1, t2 time.Time) bool {
return t1.Second() == t2.Second()
}

View File

@@ -0,0 +1,35 @@
### 窗口周期计数器
窗口周期计数类,用于记录一个窗口周期数量,并且触发某个操作的场景。
在下一个窗口周期会自动重置次数
#### =======================>使用方法说明<=========================
1.引入包
2.构造对象并次有
3.调用对象的增加次数方法
```go
package demo
import (
"time"
"goutil/counter_util"
)
func main() {
// 构造名字叫test的窗口间隔为1s计数达到2就会触发警告的窗口计数器
c := counter_util.NewCounterUtil("test", 2, checkId, func(tag string, num int, ti time.Time) {
//自定义触发动作
})
c.AddNum(1)
c.AddNum(10)
}
// 窗口周期设定为1s
func checkId(t1, t2 time.Time) bool {
return t1.Second() == t2.Second()
}
```