time.After巧妙的超时控制

package main

import (
	"fmt"
	"time"
)

func main() {
	var a chan string
	a = make(chan string)
	go sendDataTo(a)//无缓冲的channel存入数据
	go timing()
	getAchan(10*time.Second, a)
}

func sendDataTo(a chan string) {
	for {
		a <- "我是a通道的数据"
		time.Sleep(1e9 * 3)
	}
}

//在一定时间内接收不到a的数据则超时
func getAchan(timeout time.Duration, a chan string) {
	var after <-chan time.Time//声明变量
//loop:
	after = time.After(timeout)
loop:
	for {
		fmt.Println("等待a中的数据,10秒后没有数据则超时")
		select {
		case x := <-a:
			fmt.Println(x)
			goto loop
		case <-after:
			fmt.Println("timeout.")
			return
		}
	}
}

func timing() {
	//定时器,10秒钟执行一次
	ticker := time.NewTicker(10 * time.Second)
	for {
		time := <-ticker.C
		fmt.Println("定时器====>", time.String())
	}
}
loop的位置放在下面就会导致time。after不会重置,放在上面10S之内无有效数据则超时

猜你喜欢

转载自blog.csdn.net/weixin_42544051/article/details/85228521