老师,您好。3分56秒的代码有点不是很明白

来源:7-3 函数式编程例二

FrankieLee

2019-08-04

老师,您好。3分56秒的代码有点不是很明白,有三个问题,辛苦老师帮忙解答一下。

  1. 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

  1. 为什么我们在root.Traverse()调用之后,再给root.TraverseFunc里传入新的闭包,会影响到root.Traverse()的执行呢?假设传入到TraverseFunc里的所有闭包都会被执行一次,感觉这里受影响的应该是下一次调用,而不是之前的调用。
  2. 我尝试多次调用root.Traverse(),结果nodeCount都是5,nodeCount作为main函数中的一个局部变量,为何没有在多次调用TraverseFunc的时候持续累加,而是每次都是从0开始到调用结束呢?
写回答

1回答

FrankieLee

提问者

2019-08-04

我自己智障了,调用TraverseFunc的时候,实际上就是在遍历这个树,所以是我手动让它执行了三遍,而不是传了各种闭包进去,由Traverse()方法调用的时候执行。

1
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程