- 定义结构体
type RestChan struct {
Status uint32
Rw sync.RWMutex
Ch chan *azmode.ResultMode
Wg sync.WaitGroup
}
- 构造new方法
func NewRestChan(len int16) *RestChan {
var ch chan *azmode.ResultMode
ch = make(chan *azmode.ResultMode, len)
return &RestChan{Ch:ch}
}
- 结构体方法get
func (r *RestChan)Get()(bool, *azmode.ResultMode) {
var(
ok bool
rest *azmode.ResultMode
)
select {
case rest, ok = <- r.Ch:
if !ok{
fmt.Println("***********RestChan 已关闭")
return false, nil
}
case <-time.After(time.Second*1):
return false, nil
}
return true, rest
}
- 结构体方法put
func (r *RestChan)put(rest *azmode.ResultMode) bool {
select {
case r.Ch <- rest:
return true
default:
return false
}
}
- 结构体方法close
func (r *RestChan)Close() {
var(
state uint32
)
r.Rw.Lock()
state = atomic.LoadUint32(&r.Status)
if state!=1{
if atomic.CompareAndSwapUint32(&r.Status, state, 1){
fmt.Println("***********开始关闭RestChan")
close(r.Ch)
}
}
defer r.Rw.Unlock()
}
- 实践数据发送到chan
func (r *RestChan)PushSRest() {
var(
bl bool
rest *azmode.ResultMode
)
for{
if bl, rest = LT24SChan.Get(); !bl{
if atomic.LoadUint32(<24SChan.Status) != 1{
continue
}
fmt.Println("*****************已关闭 LT24SChan.Ch ")
break
}else {
if rest !=nil{
if bl = RestCh.put(rest); !bl{
r.Wg.Add(1)
go func(rest *azmode.ResultMode) {
var bl bool
for{
if bl = RestCh.put(rest); !bl{
continue
}
break
}
defer r.Wg.Done()
}(rest)
}
}
continue
}
}
}
- 实践关闭chan
go func() {
chanpip.RestCh.Wg.Wait()
chanpip.RestCh.Close()
}()