I tried to find a similar question but I couldn't, so here I am asking:
I'm using close(ch)
inside a recursive function. I need to close channel to terminate a range
loop. However, since the function is recursive, the close
is run multiple times which gives me:
panic: close of closed channel
If I comment-out the close(ch)
statement, I receive:
fatal error: all goroutines are asleep - deadlock!
Please find below my code:
package main
import "golang.org/x/tour/tree"
import "fmt"
// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk(t *tree.Tree, ch chan int) {
ch<-(t.Value)
if t.Left != nil { Walk(t.Left, ch) }
if t.Right != nil { Walk(t.Right, ch) }
close(ch) // => How to close a channel inside recursive function? ***
return
}
func main() {
ch := make(chan int)
go Walk(tree.New(1), ch)
for i := range ch {
fmt.Print(i, " ")
}
}