//关于go语言协程通道的使用 //1.通道可以带缓存,也可以不带 //2.不带缓存的,不管是读还是写都会阻塞 //3.带缓存的,如果缓存溢出,就会阻塞 //4.make(chan int,1)和make(chan int)是不一样的,第一种通道内写入两个数据会阻塞,第二种写入就会阻塞 //5.如果协程在阻塞,但是主程已经退出执行,则认为程序死锁 //6.如果程序除了主程之外(没有一个协程),处于阻塞状态,则认为程序死锁 //7.一句话:只有一个协程(可以是主程),在阻塞,认为程序处于死锁 //8.子程序是协程的一种特例,阻塞到子程序执行完毕返回,而协程可能等不到执行完毕就返回,然后条件满足再回来执行 package main import ( "fmt" ) func main() { //make(chan string,1)和make(chan string)是不一样的 //make(chan string,1)中通道的buffer是1 //这里如果写成make(chan string)会导致阻塞,死锁,因为没有缓存的通道,不管是读还是写都会阻塞 //两个解决方案,将push数据移动到写成中(使用go语句),或增加缓存, //缓存没有达到上限,就不会出现死锁的情况 chan1 := make(chan string,1) func() { fmt.Printf("在协程中,Push数据到通道\n"); chan1 <- "GO吧" }() fmt.Printf("从通道中读取到的数据:%v", <- chan1) }
有疑问加站长微信联系(非本文作者)