Я новичок с golang и каналами / программами, но я понимаю концепцию и простое использование.
Теперь я пытаюсь реализовать параллельную функцию построения дерева, алгоритм довольно прост - от сверху вниз для каждого узла я добавляю 2 дочерних элементов, а затем для каждого дочернего элемента выполняю одну и ту же операцию deepLimit times . Вот код для неконкурентного:
package main
import (
"encoding/json"
"fmt"
"time"
)
type Node struct {
Name string
Children []Node
}
func main() {
mainNode := Node{"p", nil}
AddChildrenToNode(&mainNode, 4, 0)
b, _ := json.MarshalIndent(mainNode, "", " ")
fmt.Println(string(b)) // print as json
}
func AddChildrenToNode(node *Node, depthLimit int, curDepth int) {
curDepth++
if curDepth >= depthLimit {
return // reached depth limit
}
time.Sleep(500 * time.Millisecond) // imitating hard work c:
fmt.Print(".") // status indicator
// add children
node.Children = []Node{
Node{node.Name + "-l", nil},
Node{node.Name + "-r", nil},
}
for idx, _ := range node.Children {
AddChildrenToNode(&node.Children[idx], depthLimit, curDepth) // run this for every created child, recursively
}
}
Но теперь я сталкиваюсь с трудностями, переписывая его для использования goroutine. Проблема в том, что мы на самом деле не можем знать, когда «строительство» закончено, и дать сигнал на блокировку / разблокировку основного. Я что-то пропустил? Я также пытался играть с syn c .WaitingGroup .