GO语言笔记--(五)从阻塞的通道channel中退出

go采用通道channel进行goroutine之间的通信,channel在读取时会处于阻塞状态,在某些情况并不是我们想要的效果,因此需要设置超时退出机制,可以选择select的方式,以下为实例:

package main

import ( 
"fmt"
"time"
"bufio"
"os"
)

func print_input(ch chan string) {
	fmt.Printf("Begin to print input.\n")
	for ;; {
		select {
			case input_ := <- ch:
				fmt.Printf("get %v from standard input.\n", input_)
			case <- time.After(3*time.Second): // 超时3秒没有获得数据,则退出程序,如果只是退出循环,可以return改为continue
				fmt.Printf("More than 3 second no input, return\n")
				return
		}
	}
}

func main() {
	ch := make(chan string, 10)
	defer close(ch)

	go print_input(ch)

	scanner := bufio.NewScanner(os.Stdin)
	for scanner.Scan() {
		in := scanner.Text()
		ch <- in
		if in == "EOF" {
			fmt.Printf("exit\n")
			return
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值