您的位置 首页 golang

golang中给一个channel增加done功能

实际工作中,常常会遇到这样一种情况:有一个给定的channel,我希望能够给这个channel增加检测done信号的能力,以便及时的关闭。可以这样实现:

 package main

import (
"log"
"time"
)

func main() {
done := make(chan struct{})
time.AfterFunc(10*time.Second, func() { close(done) })

before := make(chan interface{})
go func() {
defer close(before)

for i := 0; i < 100; i++ {
before <- i
time.Sleep(time.Second)
}
}()

after := orDone(done, before)

for val := range after {
log.Print(val)
}
}

func orDone(done <-chan struct{}, c <-chan interface{}) <-chan interface{} {
result := make(chan interface{})

go func() {
defer close(result)

for {
select {
case <-done:
return
case val, ok := <-c:
if !ok {
return
}
select {
case result <- val:
case <-done:
}
}
}
}()

return result
}  

这种手段在go中被称为orDone channel。需要注意的是,在result <- val的时候同样需要考虑done信号,所以封装在了select多路复用中。

文章来源:智云一二三科技

文章标题:golang中给一个channel增加done功能

文章地址:https://www.zhihuclub.com/97126.shtml

关于作者: 智云科技

热门文章

网站地图