運行跟隨 golang 片段時出現錯誤。我認為進度將在 wg.Wait() 處阻塞,直到 go 例程結束。那么該值將從 c1 獲得。但它可能不會按預期進行。func main() {c1 := make(chan string)//var c1 chan stringvar wg sync.WaitGroupwg.Add(1)go func() { defer wg.Done() fmt.Printf("go routine begin\n") time.Sleep(1 * time.Second) c1 <- "one" fmt.Printf("go routine done\n")}()wg.Wait()fmt.Printf("done c1: %v\n", <-c1)fmt.Printf("out\n")}錯誤信息是, go routine begin fatal error: all goroutines are asleep - deadlock!
3 回答

心有法竹
TA貢獻1866條經驗 獲得超5個贊
寫入c1
永遠不會執行,因為讀取c1
是在之后wg.Wait()
,它將停止直到c1
被寫入。所以 main goroutine 等待,wg.Wait()
嵌套 goroutine 等待c1
write。
c1
您可以使通道緩沖,或在單獨的 goroutine 上等待讀取。

HUWWW
TA貢獻1874條經驗 獲得超12個贊
在 Golang 中,無緩沖通道上的寫操作是阻塞的。從文檔中可以清楚地看到。
您的執行被阻止在
c1 <- "one"
延期聲明
defer wg.Done()
從不執行。

米脂
TA貢獻1836條經驗 獲得超3個贊
在您的代碼中,您正在使用一個無緩沖的通道,該通道會阻塞直到接收器接收到“一個”。在這種情況下,代碼不會超過 wg.Wait() 因為 wg.Done() 永遠不會被執行。
我想這就是你所追求的。
func main() {
c1 := make(chan string)
//var c1 chan string
go func() {
fmt.Printf("go routine begin\n")
time.Sleep(1 * time.Second)
c1 <- "one"
fmt.Printf("go routine done\n")
}()
fmt.Printf("done c1: %v\n", <-c1)
fmt.Printf("out\n")
}
- 3 回答
- 0 關注
- 174 瀏覽
添加回答
舉報
0/150
提交
取消