信号管理器

来源:互联网 发布:淘宝上兼职是真的吗 编辑:程序博客网 时间:2024/05/21 06:20

信号管理器

信号

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

具体实现代码如下

package middlewareimport (    "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"    }}
原创粉丝点击