老师,您好。3分56秒的代码有点不是很明白
来源:7-3 函数式编程例二

FrankieLee
2019-08-04
老师,您好。3分56秒的代码有点不是很明白,有三个问题,辛苦老师帮忙解答一下。
Traverse
方法里指定了传入TraverseFunc
里的闭包函数,为什么在entry.go
里面传入到TraverseFunc
里的闭包能起作用呢?我对代码做了些改动,输出的内容出现了明显的先后关系,而且看起来像是遍历了多遍。
// 示例一,在root.Traverse()之后加入新的闭包去输出节点
fmt.Println("Start traverse.")
root.Traverse()
nodeCount := 0
root.TraverseFunc(func (*tree.Node) {
nodeCount++
})
root.TraverseFunc(func (node *tree.Node) {
fmt.Print("Node value:")
node.Print()
})
fmt.Println("Node count:", nodeCount)
// result:(请不要在意节点的值,我随便初始化的树)
// Start traverse.
// 3
// 4
// 5
// 2
// 5
// Node value:3
// Node value:4
// Node value:5
// Node value:2
// Node value:5
// Node count: 5
// 示例二,在root.Traverse()之前加入新的闭包去输出节点
fmt.Println("Start traverse.")
nodeCount := 0
root.TraverseFunc(func (*tree.Node) {
nodeCount++
})
root.TraverseFunc(func (node *tree.Node) {
fmt.Print("Node value:")
node.Print()
})
root.Traverse()
fmt.Println("Node count:", nodeCount)
// result:(请不要在意节点的值,我随便初始化的树)
// Start traverse.
// Node value:3
// Node value:4
// Node value:5
// Node value:2
// Node value:5
// 3
// 4
// 5
// 2
// 5
// Node count: 5
- 为什么我们在
root.Traverse()
调用之后,再给root.TraverseFunc
里传入新的闭包,会影响到root.Traverse()
的执行呢?假设传入到TraverseFunc
里的所有闭包都会被执行一次,感觉这里受影响的应该是下一次调用,而不是之前的调用。 - 我尝试多次调用
root.Traverse()
,结果nodeCount
都是5,nodeCount
作为main
函数中的一个局部变量,为何没有在多次调用TraverseFunc
的时候持续累加,而是每次都是从0开始到调用结束呢?
写回答
1回答
-
FrankieLee
提问者
2019-08-04
我自己智障了,调用TraverseFunc的时候,实际上就是在遍历这个树,所以是我手动让它执行了三遍,而不是传了各种闭包进去,由Traverse()方法调用的时候执行。
10
相似问题