在go语言中实现在ticker停止后关闭通道的示例代码

2023-06-01 00:00:00 示例 停止 通道

这是一个关于如何在time.NewTicker()函数之后关闭通道的例子--ticker停止了。即当所有的goroutines都完成后关闭通道。


从文档

http://golang.org/pkg/time/#Ticker.Stop 。

Stop关闭了一个ticker。

在Stop之后,不再有tick被发送。

停止并不关闭通道,以防止从通道中读出的数据不正确地成功。


如果你想关闭通道,下面的代码示例也许对你有用:

package main

 import (
         "fmt"
         "time"
 )
 
 func keepTicking(f func()) chan bool {
         done := make(chan bool, 1)
         go func() {
                 ticker := time.NewTicker(time.Duration(1) * time.Second)
                 defer ticker.Stop()
                 for {
                         select {
                         case <-ticker.C:
                                 f()
                         case <-done:
                                 fmt.Println("done")
                                 return
                         }
                 }
         }()
         return done
 }
 
 func main() {
         //继续计时,直到10秒,并设置完成=true
         done := keepTicking(func() {
                 fmt.Println("tick,tock.....")
         })
         time.Sleep(time.Duration(10) * time.Second)
         
         //当所有程序完成后,关闭通道。
         close(done)
         
         time.Sleep(time.Duration(10) * time.Second)
 }


输出:

tick,tock.....
tick,tock.....
tick,tock.....
tick,tock.....
tick,tock.....
tick,tock.....
tick,tock.....
tick,tock.....
tick,tock.....
done

相关文章