我在 go 教程中编写了Walk 函数,该函数基本上是按顺序遍历树的。我有什么作品:
package main
import (
"fmt"
"code.google.com/p/go-tour/tree"
)
// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk__helper(t *tree.Tree, ch chan int) {
if (t == nil) {
return
}
Walk__helper(t.Left, ch)
ch <- t.Value
Walk__helper(t.Right, ch)
}
func Walk(t *tree.Tree, ch chan int) {
Walk__helper(t, ch)
close(ch)
}
func main() {
ch := make(chan int)
go Walk(tree.New(1), ch)
for v := range ch {
fmt.Println(v)
}
}
为什么我必须使用go Walk(tree.New(1), ch)而不仅仅是Walk(tree.New(1), ch)?
我的印象是go关键字基本上会产生一个新线程。在这种情况下,我们会遇到问题,因为 for 循环可能会在子例程完成之前运行。
奇怪的是,当我取出go关键字时,我陷入了僵局。这对我来说是相当违反直觉的。go关键字在这里到底是做什么的?
慕容3067478
相关分类