package main
import (
"fmt"
"time"
)
//发送者
func sender(c chan int) {
for i := 0; i < 100; i++ {
time.Sleep(time.Second * 11)
c <- i
}
}
func main() {
c := make(chan int)
go sender(c)
/* timer := time.NewTimer(1 * time.Second) */
/* timeout := time.After(time.Second * 2) */
ticker := time.NewTicker(10 * time.Second)
for {
select {
/* case d := <-timer.C: */
/* fmt.Println(d,"这是一次性的timer >>>>>") */
/* case d := <-timeout: */
/* fmt.Println(d,"这是一次性的timeout >>>>>") */
case d := <-c:
fmt.Println(d)
case d := <-ticker.C:
fmt.Println(d,"这是定时的ticker >>>>>")
/* case d := <-time.After(time.Second * 3): */
/* fmt.Println(d, "这是定时的timeout *****") */
case d := <-time.NewTimer(time.Second * 3).C:
fmt.Println(d, "这是定时的timeout *****")
}
}
}
time.After和time.NewTimer是一样的,都是一次性的,
select开始的时候,会把这两个初始化,然后select会阻塞,等待从某个管道中取数据。
1.当过了相应时间,其他管道都没有数据,time.After有数据的时候,就从这个里面取数据,下次select的时候重新初始化
2.没有等到相应时间过去,其他管道有数据,select从其他管道取数据,然后再次select的时候,time.After重新初始化