我想使用并發模型來編寫一個函數,以防輸入太大而并行處理會更有效,但是它永遠不會結束。假設有一個struct定義為:type Tree struct { Name string `json:"name"` SubTrees []*Tree `json:"subTrees,omitempty"` Leaves []string `json:"leaves"`}我想寫一個函數來計算Leaves整個遞歸結構的總數。這很容易通過以下方式進行遞歸:func (tree *Tree) CountLeaves() int { curr := len(tree.Leaves) for _, s := range tree.SubTrees { curr += s.CountLeaves() } return curr}很好,一切都很好,但是如果結構太大,效率將會很低,所以我想將其重構為并發并使用通道。這是我嘗試進行重構的嘗試:func (tree *Tree) CountLeaves() int { var wg sync.WaitGroup ch := make(chan int) defer close(ch) go count(tree, true, ch, &wg) var total int wg.Add(1) go func(total *int) { for x := range ch { fmt.Println(x) *total += x } wg.Done() }(&total) wg.Wait() return total}func count(t *Tree, root bool, ch chan int, wg *sync.WaitGroup) { defer wg.Done() ch <- len(t.Leaves) if t.SubTrees != nil { wg.Add(len(t.SubTrees)) for _, s := range t.SubTrees { go count(s, false, ch, wg) } wg.Wait() } if root { ch <- -1 }}目前,我可以通過計算當前總數所需的通道收集所有數字,Leaves但函數永無止境。-1來自根Tree結構的終止值永遠不會通過通道推送或接收,我也不知道為什么。有任何想法嗎?
- 1 回答
- 0 關注
- 277 瀏覽
添加回答
舉報
0/150
提交
取消