我一直在研究這個(gè)并想出了:type Function struct{? ? Function func(*TaskGroup, []interface{})? ? Args []interface{}}type TaskGroup struct{? ? Group sync.WaitGroup? ? Functions []Function}func (x *TaskGroup) Start() {? ? for _, Function := range x.Functions{? ? ? ? x.Group.Add(1)? ? ? ? go Function.Function(x, Function.Args)? ? }? ? x.Group.Wait()}為了更輕松地使用多個(gè)功能,我必須等待。以下測(cè)試將起作用,我不明白為什么:func auxC(x *TaskGroup, args []interface{}){? ? defer x.Group.Done()? ? messageOut := args[0].(chan string)? ? messageOut <- "TestC"}func auxD(x *TaskGroup, args []interface{}){? ? defer x.Group.Done()? ? messageOut := args[0].(chan string)? ? messageOut <- "TestD"}func TestTaskGroupBaseB(t *testing.T) {? ? messageC := make(chan string, 1)? ? messageD := make(chan string, 1)? ? tg := TaskGroup{? ? ? ? Functions: []Function{? ? ? ? ? ? {auxC, []interface{}{messageC}},? ? ? ? ? ? {auxD, []interface{}{messageD}},? ? ? ? },? ? }? ? tg.Start()? ? fmt.Println(<- messageC)? ? fmt.Println(<- messageD)? ? time.Sleep(100 * time.Millisecond)}我首先嘗試使用像這樣的無(wú)緩沖通道:messageC := make(chan string)messageD := make(chan string)但它不起作用,它只是永遠(yuǎn)卡住而不做任何事情,所以我有幾個(gè)問(wèn)題:為什么大小為 1 的緩沖通道可以工作,而無(wú)緩沖通道則不能?默認(rèn)大小不是無(wú)緩沖1嗎?重構(gòu)代碼,見(jiàn)注釋:主要/測(cè)試:func auxC(args []interface{}){? ? messageOut := args[0].(chan string)? ? messageOut <- "TestC"}func auxD(args []interface{}){? ? messageOut := args[0].(chan string)? ? messageOut <- "TestD"}func TestTaskGroupBaseB(t *testing.T) {? ? messageC := make(chan string,1)? ? messageD := make(chan string,1)? ? tg := TaskGroup{? ? ? ? Functions: []Function{? ? ? ? ? ? {auxC, []interface{}{messageC}},? ? ? ? ? ? {auxD, []interface{}{messageD}},? ? ? ? },? ? }? ? tg.Wait()? ? fmt.Println(<- messageC)? ? fmt.Println(<- messageD)? ? time.Sleep(100 * time.Millisecond)}任務(wù)組:type Function struct{? ? Function func([]interface{})? ? Args []interface{}}type TaskGroup struct{? ? Group sync.WaitGroup? ? Functions []Function
1 回答

Cats萌萌
TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超9個(gè)贊
使用緩沖區(qū)大小為 1 的通道,首先寫(xiě)入緩沖區(qū)數(shù)據(jù),然后 goroutine 結(jié)束,您可以在主 goroutine 中讀取緩沖數(shù)據(jù)。
當(dāng)通道大小為零時(shí),對(duì)通道的寫(xiě)入會(huì)阻塞,直到另一個(gè) goroutine 從中讀取。所以你的兩個(gè) goroutine 都在等待寫(xiě)入通道。如果在通道讀入 main 之后移動(dòng) Wait() 調(diào)用,它應(yīng)該可以工作。
- 1 回答
- 0 關(guān)注
- 163 瀏覽
添加回答
舉報(bào)
0/150
提交
取消