go的chan
无缓冲区channel
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int) // 创建无缓冲channel
go func() {
fmt.Println("time sleep 5 second...")
time.Sleep(5 * time.Second)
<-ch
}()
fmt.Println("即将阻塞...")
ch <- 1 // 协程将会阻塞,等待数据被读取
fmt.Println("ch 数据被消费,主协程退出")
}
结果,消费完才能继续
即将阻塞...
time sleep 5 second...
ch 数据被消费,主协程退出
有缓冲区channel
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int, 1) // 创建有缓冲channel
go func() {
fmt.Println("time sleep 5 second...")
time.Sleep(5 * time.Second)
<-ch
}()
ch <- 1 // 协程不会阻塞,等待数据被读取
fmt.Println("第二次发送数据到channel, 即将阻塞")
ch <- 1 // 第二次发送数据到channel, 在数据没有被读取之前,因为缓冲区满了, 所以会阻塞主协程。
fmt.Println("ch 数据被消费,主协程退出")
}
总体原则就是缓冲区默认为0,缓冲区不满不阻塞
带缓冲通道被填满时,尝试再次发送数据时发生阻塞。
带缓冲通道为空时,尝试接收数据时发生阻塞。
参考资料:
http://www.zzvips.com/article/71666.html