029_go语言中的非阻塞通道

代码演示

package main

import "fmt"

func main() {
	messages := make(chan string)
	signals := make(chan bool)
	select {
	case msg := <-messages:
		fmt.Println("received message", msg)
	default:
		fmt.Println("no message received")
	}
	msg := "hi"
	select {
	case messages <- msg:
		fmt.Println("sent message", msg)
	default:
		fmt.Println("no message sent")
	}
	select {
	case msg := <-messages:
		fmt.Println("received message", msg)
	case sig := <-signals:
		fmt.Println("received signal", sig)
	default:
		fmt.Println("no activity")
	}
}

  

代码运行结果

no message received
no message sent
no activity

  

代码解读
select中的每个case必须是一个通信操作,要么是发送要么是接收。select随机执行一个可运行的case。如果没有case可运行,它将阻塞,直到有case可运行。
常规的通过通道发送和接收数据都是阻塞的,但是可以通过带default的select实现非阻塞的发送和接收数据
以上例子通过三个select来演示非阻塞的接收,发送,和多路选择
第一个select是非阻塞接收的例子,由于通道messages中没有值存在,所以select会到default中执行
第二个select是非阻塞发送的例子,这里要注意,由于通道messages在发送前,是一个nil通道,所以case也不会执行
第三个select是一个多路选择的例子
posted @ 2018-04-13 01:37  Joestar  阅读(234)  评论(0编辑  收藏  举报