2 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
為什么是<- done
作品?
它起作用是因?yàn)檫\(yùn)行時(shí)檢測(cè)到您正在向其他地方的通道寫入內(nèi)容。
如果我取消對(duì)最后一行的注釋會(huì)發(fā)生什么?
運(yùn)行時(shí)足夠聰明,知道沒有其他東西被寫入并且它會(huì)死鎖。
獎(jiǎng)勵(lì),如果您的內(nèi)存非常有限,您可以使用done := make(chan struct{})
and done <- struct{}{}
,struct{}
保證使用 0 內(nèi)存。

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
收聽 channel<- done是一個(gè)阻塞操作,所以你的程序不會(huì)繼續(xù),直到發(fā)送 true 或 false ,即done <- true。
根據(jù)情況,您的問題可以有幾個(gè)不同的答案。
例如,假設(shè)您想要并行化一系列需要很長時(shí)間的函數(shù)調(diào)用。
我會(huì)為此使用該sync軟件包
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
longOp()
wg.Done()
}()
}
// will wait until wg.Done is called 10 times
// since we made wg.Add(1) call 10 times
wg.Wait()
}
func longOp() {
time.Sleep(time.Second * 2)
fmt.Println("long op done")
}
- 2 回答
- 0 關(guān)注
- 257 瀏覽
添加回答
舉報(bào)