go 协程和 select 的知识点
資深大佬 : xing393939 4
无缓存管道和缓存管道
先看看无缓存管道的例子:
a := make(chan bool) go func() { log.Println("goroutine") <-a }() a <- true
这里主协程会等待子协程执行完,但是如果把第一行改成 a := make(chan bool, 1),那么主协程写完消息直接退出了,子协程没有机会执行(只有一个 cpu 时)。但是改成如下子协程又可以执行了:
a := make(chan bool, 1) go func() { log.Println("goroutine") <-a }() a <- true a <- true
管道关闭后,select 能一直接受 close 信号
a := make(chan bool, 1) go func() { close(a) }() for { select { case _, ok := <-a: log.Println(ok) } }
而用 for range 是不能获取 close 信号的,如下:
a := make(chan bool, 1) go func() { a <- true close(a) }() for { for v := range a { log.Println(v) } }
大佬有話說 (1)