前言:
Go 的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前的groutine。所以,有人也会说select是用来阻塞监听goroutine的。
阻塞main函数案例
有时候我们会让main函数阻塞不退出,如http服务,我们会使用空的select{}来阻塞main goroutine
package main import ( "fmt" "time" ) func main() { bufChan := make(chan int) go func() { for{ bufChan <-1 time.Sleep(time.Second) } }() go func() { for{ fmt.Println(<-bufChan) } }() select{} }
如上所示,这样主函数就永远阻塞住了,这里要注意上面一定要有一直活动的goroutine,否则会报deadlock
如果去掉goroutine内的for循环
func main() { bufChan := make(chan int) go func() { bufChan <- 1 time.Sleep(time.Second) }() go func() { fmt.Println(<-bufChan) }() select {} }
则会出现死锁
标签:goroutine,bufChan,阻塞,golang,func,main,select From: https://www.cnblogs.com/wuchangblog/p/16719855.html