doushang1964 2018-04-19 14:39
浏览 12
已采纳

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

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, " ")
    }
}
  • 写回答

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, " ")
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?