无缓冲和带缓冲channel的区别
常规定义的channel都是默认不带缓冲的,如下代码所示
package main import ( "fmt" ) func main() { c := make(chan int) c <- 1 fmt.Println(<-c) }运行上述代码,会产生一个错误 因为在默认不带缓冲的channel中,每一个发送者与接收者都会阻塞当前线程,只有当接受者与发送者都准备就绪了,channel才能正常使用,正确的使用如下所示
package main import ( "fmt" ) func main() { c := make(chan int) //使用Goroutine使当前channel的发送不会阻塞线程 go func() { c <- 1 }() fmt.Println(<-c) }那么如何让程序同步执行,但是又不会阻塞线程呢?这是就可以用带缓冲的channel来进行实现,如下代码所示:
-
package main import ( "fmt" ) func main() { //创建一个缓冲大小为2的channel c := make(chan int, 2) c <- 1 c <- 2 fmt.Println(<-c) fmt.Println(<-c) }
-
package main import ( "fmt" ) func main() { //创建一个缓冲大小为2的channel c := make(chan int, 2) c <- 1 c <- 2 //这里channel的发送超出了缓冲的大小,所以会因为阻塞而导致程序死锁 c <- 3 fmt.Println(<-c) fmt.Println(<-c) }