2018-04-19 14:39

如何在递归函数中关闭通道

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!

``````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, " ")
}
}
``````
• 写回答
• 好问题 提建议
• 追加酬金
• 关注问题
• 邀请回答

2条回答默认 最新

• dqysi86208 2018-04-19 14:58
最佳回答

Close the channel outside of the recursive function:

``````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) }
}

func main() {
ch := make(chan int)
go func() {
defer close(ch)
Walk(tree.New(1), ch)
}()
for i := range ch {
fmt.Print(i, " ")
}
}
``````
评论
解决 无用
打赏 举报