測驗了一下go的channel,不close的時候,感覺應該不會報錯,但是運行提示死鎖了,為什么,求解?換成有緩沖的channel也是報死鎖的錯誤!!!!!!!
package main
import (
"fmt"
)
func main() {
channel:= make(chan int)
go func() {
for i := 0; i < 5; i++ {
ch <- i
fmt.Println(i)
}
//close(channel)
}()
for {
if num, ok := <-channel; ok == true {
fmt.Println("num=", num)
} else {
break
}
}
}
uj5u.com熱心網友回復:
沒有實際除錯你這段代碼。分析之后認為,你這個channel是在其他五個goroutine 里面往其中寫入資料,但是寫入次數是有限的,但你卻在主goroutine 里面寫了一個無限回圈。當其他goroutine推出之后,你的main 函式會因為讀channel永遠阻塞。uj5u.com熱心網友回復:
num,ok:=<-channel當channel未close時 ,如channel內有資料則num有值、ok為true;無資料時阻塞。
當channel已close時,如channel有資料則同上,無資料時num為零值、ok為false
uj5u.com熱心網友回復:
ok為falseuj5u.com熱心網友回復:
協程 不是異步的 你寫一條需要有對應的讀,所有你這樣寫會發生阻塞的問題,你應該 給channel:= make(chan int) 價格快取區 類似這樣:channel:= make(chan int,1024) 這個時候他的存盤為1M 只要沒有達到1M就會一直寫 哪怕沒有讀也是一樣 直到達到1M后阻塞 希望可以幫到你uj5u.com熱心網友回復:
chanel不close,num, ok := <-channel;接收5次資料后就一直阻塞,而阻塞又在回圈里,造成死鎖uj5u.com熱心網友回復:
樓主主要是不知道num, ok := <-channel; 這個ok指的是chan是否關閉,你//close(channel)這句注釋掉了,那么num, ok := <-channel的ok永遠是true,而這陳述句又在死回圈內,不報死鎖才怪。uj5u.com熱心網友回復:
問題已經解決了嗎啊uj5u.com熱心網友回復:
我只看到了 ch未定義uj5u.com熱心網友回復:
ok去掉,也不要else轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/112296.html
標籤:go語言
上一篇:go語言資料型別轉換,求大神解答
