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()