chan
chan: 信道/管道
特点:缓冲大小为零的时候,必须读写同步,否者程序会被阻塞(死锁)
例子:
package main
import "fmt"
var ch chan int = make(chan int)
func cun() {
ch <- 0 // 2⃣
}
func qu(){
fmt.println(<-ch)
}
func main() {
cun() // 1⃣
qu() // 3⃣
}
这段代码会阻塞,原因如下:
1⃣函数里面有个2⃣
2⃣正在寸入,但是ch没有缓冲大小了,存不进0这个值,于是阻塞了;必须等到取了才能写入,或者改变ch的缓冲大小把0存入
3⃣是取ch,可是根本到不了这个地方,因为1⃣步骤阻塞了;
死锁:2⃣在等3⃣,可是3⃣又在等2⃣;
解决方案:
一,cun() 这一行改成: go cun() // 异步执行foo()
二,调换cun(), qu() 的执行;改成:
go qu()
cun()
注意,不能写成如下两个顺序
1) cun()
go qu()
2) qu()
go cun()
// 因为会在go 的上一步就阻塞了,go的作用函数压根没有执行到
三,声明的时候增加一个缓冲大小,声明改成:var ch chan int = make(chan int, 1)
执行顺序必须如下:
cun()
qu()