信号管理器

信号管理器

信号

这个实现比较简单。其实经过之前的训练和学习,我们可以总结,一般实现方法就是,分析接口,校验接口中需要的成员变量,定义结构体。结构体实现其成员方法。

具体实现代码如下

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"
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值