1.channel阻塞
初始化定义的intchan的长度是10,所以当循环写入100数字是会发生channel阻塞的问题。
func main() {
intChan := make(chan int, 10)
go write(intChan)
time.Sleep(10 * time.Second)//为了避免主程序的快速退出
}
func write(ch chan int) {
for i := 0; i < 100; i++ {
ch <- i
fmt.Println("put data:",i)
}
}
输出结果:
put data: 0
put data: 1
put data: 2
put data: 3
put data: 4
put data: 5
put data: 6
put data: 7
put data: 8
put data: 9
同时写两个线程,一边写一边读,读出来一个,就又有空间了。就会解决channel阻塞这个问题
func main() {
intChan := make(chan int, 5)
go write(intChan)
go read(intChan)
time.Sleep(10 * time.Second)
}
func write(ch chan int) {
for i := 0; i < 10; i++ {
ch <- i
fmt.Println("put data:",i)
}
}
func read(ch chan int) {
for {
var b int
b =<- ch
fmt.Println(b)
}
}
输出结果:
0
put data: 0
put data: 1
put data: 2
put data: 3
put data: 4
put data: 5
put data: 6
1
2
3
4
5
6
7
put data: 7
put data: 8
put data: 9
8
9