Go基础系列:nil channel用法示例
2018-11-21 13:33
751 查看
Go channel系列:
当未为channel分配内存时,channel就是nil channel,例如var ch1 chan int。nil channel会永远阻塞对该channel的读、写操作。
nil channel会阻塞对该channel的所有读、写。所以,可以将某个channel设置为nil,进行强制阻塞,对于select分支来说,就是强制禁用此分支。
以下是一个nil channel的示例:
package main import ( "fmt" "math/rand" "time" ) // 不断向channel c中发送[0,10)的随机数 func send(c chan int) { for { c <- rand.Intn(10) } } func add(c chan int) { sum := 0 // 1秒后,将向t.C通道发送时间点,使其可读 t := time.NewTimer(1 * time.Second) for { // 一秒内,将一直选择第一个case // 一秒后,t.C可读,将选择第二个case // c变成nil channel后,两个case分支都将一直阻塞 select { case input := <-c: // 不断读取c中的随机数据进行加总 sum = sum + input case <-t.C: c = nil fmt.Println(sum) } } } func main() { c := make(chan int) go add(c) go send(c) // 给3秒时间让前两个goroutine有足够时间运行 time.Sleep(3 * time.Second) }
上面的示例中,send()向通道c不断发送10以内的随机整数,add()则在一秒内不断读取通道c中的数据并进行加总。一秒时间到后,t.C通道就会有数据,第二个case分支就会被选中,第二个case会让第一个case评估的channel变为nil channel,使得第一个case从此永久禁用,因为第二个case没有多余的数据可读,它也被永久禁用。总共3秒之后,main goroutine结束,程序结束。
如果不理解NewTimer(d),换成After(d)是一样的,After(d)和NewTime(d).C是等价的。
func add(c chan int) { sum := 0 t := time.After(1 * time.Second) for { select { case val := <-c: sum = sum + val case <-t: c = nil fmt.Println(sum) } } }
相关文章推荐
- Go基础系列:互斥锁Mutex和读写锁RWMutex用法详述
- Java基础系列:(4)多线程的一些用法示例
- sas基础系列(3)-表格标颜色示例
- Java基础系列之五:Spring使用入门示例
- 谷歌地图开发经验分享系列之二:Google Map API基础对象操作和用法(Map类和LatLng类)
- Go基础系列:流程控制结构
- go 有缓冲channel示例
- Go基础系列:空接口
- go语言示例-Timer计时器的用法
- .NET基础示例系列之八:WMI获取进程信息
- .NET基础示例系列之十:不规则窗体
- .NET基础示例系列之二十三:WebRequest、WebResponse及刷票程序
- Go基础系列(7):map类型
- Android OpenGL ES零基础系列(一):理解GLSurfaceView,GLSurfaceView.Render的基本用法
- Go 并发编程基础(一)goroutine,channel
- .NET基础示例系列之十七:VML绘制中国地图
- .NET基础示例系列之五:泛型
- 学习javascript基础知识系列第三节 - ()()用法
- .NET基础示例系列之十六:制做进程监视器
- expect语法基础: while、for 循环、if 语句的用法示例