信号管理器
信号
这个实现比较简单。其实经过之前的训练和学习,我们可以总结,一般实现方法就是,分析接口,校验接口中需要的成员变量,定义结构体。结构体实现其成员方法。
具体实现代码如下
package middleware
import (
"fmt"
"sync"
)
type StopSign interface {
Sign() bool
Signed() bool
Reset()
Deal(code string)
DealCount(code string) uint32
DealTotal() uint32
Summary() string
}
func NewStopSign() StopSign {
ss := &myStopSign{
dealCountMap: make(map[string]uint32),
}
return ss
}
type myStopSign struct {
rwmutex sync.RWMutex // 读写锁。
signed bool // 表示信号是否已发出的标志位。
dealCountMap map[string]uint32 // 处理计数的字典。
}
func (ss *myStopSign) Sign() bool {
ss.rwmutex.Lock()
defer ss.rwmutex.Unlock()
if ss.signed {
return false
}
ss.signed = true
return true
}
func (ss *myStopSign) Signed() bool {
return ss.signed
}
func (ss *myStopSign) Reset() {
ss.rwmutex.Lock()
defer ss.rwmutex.Unlock()
ss.signed = false
ss.dealCountMap = make(map[string]uint32)
}
func (ss *myStopSign) Deal(code string) {
ss.rwmutex.Lock()
defer ss.rwmutex.Unlock()
if ss.signed {
return
}
if _, ok := ss.dealCountMap[code]; ok {
ss.dealCountMap[code] = 1
} else {
ss.dealCountMap[code] += 1
}
}
func (ss *myStopSign) DealCount(code string) uint32 {
ss.rwmutex.RLock()
defer ss.rwmutex.RUnlock()
return ss.dealCountMap[code]
}
func (ss *myStopSign) DealTotal() uint32 {
ss.rwmutex.RLock()
defer ss.rwmutex.RUnlock()
var total uint32
for _, v := range ss.dealCountMap {
total += v
}
return total
}
func (ss *myStopSign) Summary() string {
if ss.signed {
return fmt.Sprintf("signed: true, dealCount: %v", ss.dealCountMap)
} else {
return "signed: false"
}
}