在Go巡回赛中有一个关于二叉树的exercise。
我已经解决了这个问题,一些问题在路上出现了。
这是树的结构
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,
// it reads infinitely from ch.
println(i)
}
}我的问题是在主函数中,它清楚地表明ch没有关闭,那么为什么我不能关闭Walk函数中的通道呢?
发布于 2019-07-04 13:01:14
因为函数是递归的,因此,Walk的每个调用都将到达关闭通道的行,并且每个调用都会试图关闭通道。因此,在第一个通道之后试图关闭通道的任何一个都将试图关闭一个封闭通道。
https://stackoverflow.com/questions/56880628
复制相似问题