2 回答

TA貢獻1900條經驗 獲得超5個贊
當您使用 sleep 時,它為 goroutine 提供時間啟動,然后當它從通道讀取時, main 在最后一個println(" wait end")被調用之前退出。
但是,如果您不調用 sleep,defer 將阻塞,直到 goroutine 從中讀取并為其提供足夠的時間進行打印。
如果您將代碼移動到不同的函數并從 main 調用它,它將按預期工作。
func stuff() {
done := make(chan bool)
println("enter")
defer func() {
println("exit")
}()
go func() {
println(" wait start")
<-done
println(" wait end")
}()
defer func() {
println(" notify start")
done <- true
println(" notify end")
}()
}
func main() {
stuff()
}

TA貢獻1831條經驗 獲得超4個贊
done通道上的事件序列:“[當] 通道無緩沖時,只有當發送方和接收方都準備好時,通信才會成功。” 對于你的例子,
的done信道是無緩沖:main。
done := make(chan bool)
接收等待發送:go func()。
<-done
接收就緒 ( <-done),發送:defer func()。
done <- true
該main函數結束,不等待夠程(go func())結束。
輸出:
enter
wait start
notify start
notify end
exit
通道為并發執行函數提供了一種機制,通過發送和接收指定元素類型的值來進行通信。未初始化通道的值為 nil。
可以使用內置函數 make 創建一個新的初始化通道值,該函數將通道類型和可選容量作為參數:
make(chan int, 100)
容量(以元素數為單位)設置通道中緩沖區的大小。如果容量為零或不存在,則通道沒有緩沖,只有當發送方和接收方都準備好時,通信才能成功。否則,如果緩沖區未滿(發送)或非空(接收),則通道被緩沖并且通信成功而不會阻塞。一個 nil 通道永遠不會準備好進行通信。
程序執行首先初始化主包,然后調用函數 main。當該函數調用返回時,程序退出。它不會等待其他(非主)goroutine 完成。
- 2 回答
- 0 關注
- 263 瀏覽
添加回答
舉報