ぷらこのきろく

メモとかテストとか備忘録とか

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()関数書かないといけないのか…

どうすんだねと考えてる ←いまここ