golang練習
先日、goという言語を見つけて、プログラムのリハビリがてらチュートリアルを遊んでいる。
http://go-tour-jp.appspot.com/
んで、がんばって最後の方までいくと、二分木というものがでてきて、それをたどれと。。
情報系の人だったら学校の授業で出てきただろうネタだろうけど、僕にはさっぱり。
んで
func Walk(t *tree.Tree, ch chan int) { ch <- t.Value if t.Left != nil { go Walk(t.Left, ch) } if t.Right != nil { go Walk(t.Right, ch) } return } func main() { ch := make(chan int, 10) go Walk(tree.New(1), ch) }
てなことをやった。
で、chに入ってるものを取り出そうと、
for i := range ch { fmt.Println(i) }
ってやったら、chが閉じてないからずっと待ち続けてるよーってな感じのエラーが出た。
もちろんforループを10回だけ回すのはできるけど、もしこの木のnodeの数が5だったり(今回の問題の仕様では10固定なんだけど)したら、やっぱりエラーになるだろうから、chをうまく閉じられたらと思った。
かといって、Walk()関数の最後にclose(ch)とか書いたら、おそらく再帰などで他で動いているであろうWalk関数のchも閉ざされてしまうだろう。
ということは、再帰を使わずにWalk()関数書かないといけないのか…
どうすんだねと考えてる ←いまここ