旅途二叉树执行中的通道问题

时间:2019-07-04 04:25:11

标签: go

有一个关于二叉树的练习。

我已经解决了这个问题,并在途中遇到了一些问题。

这是树的结构

type Tree struct {
    Left  *Tree
    Value int
    Right *Tree
}

这是一些代码

//send values into channel
func Walk(t *tree.Tree, ch chan int){
    if t.Left != nil{
        Walk(t.Left, ch)
    }
    ch <- t.Value 

    if t.Right != nil{
        Walk(t.Right,ch)
    }

        //close(ch) will trigger a warning: close of a closed channel


}

//get values from channel
func main() {
    ch := make(chan int, 10)
    go Walk(tree.New(1),ch)
    //for i:=0;i<10;i++{  //this line works
    for i:= range ch{     //this line doesn't because it reads
                              //infinitely from ch
        println( i) 
    }

我的问题是在主功能中,它清楚地表明ch没有关闭,那么为什么我不能在Walk功能中关闭通道?

1 个答案:

答案 0 :(得分:2)

由于该函数是递归的,因此,Walk的每次调用都将到达关闭通道的行,并且每个调用都将尝试关闭通道。因此,其中任何一个在第一个通道之后尝试关闭通道的人都将试图关闭一个已关闭的通道。