Go言語と言うのがあまりにも身の回りで流行っていて焦ったので、
A Tour of Go の日本語版を一通り終えた。感想を書く。
よかったところ
Go の基本的な構文と機能にしぼって、一つずつ説明してくれているので進めやすい感じがした。特に、機能ごとに割と実践的な演習問題があるので、さぼらずにちゃんとやると身に付く感じがする。
どんな簡単なものでも自分で考えて演習問題をやるの、言語の習得には良い感じだと思う。例えば
if _, exist := visited[url]; !exist { body, urls, err := fetcher.Fetch(url) // ... }
だとか
res, err := DoFooBar() if err != nil { panic(err.Error()) } res.FollowingFooBar() // ...
みたいな典型的なGoのコードのかたちは、その言語の固有のリズムみたいなものである。言語Xを使うのであるから、言語Xのここがキモ〜いみたいな主観を言ってもあんまり詮無いと思うので、その言語の文化に深く潜って行って慣れて、その言語で考えられるようになるしかない。批判するのは十分考えられるようになってから建設的にやれば良いと思う。
なので、まずは書くための簡単な課題を作って、リズムに慣れさせるというコンセプトは良かった。
あと、PlayGroundが偉大だと思う。エディタ設定は初学者の障壁になると思うけど、それをすっ飛ばせる。勉強するためのデバイスを選ばなくて済むのも良い。家の非力なMBAでも十分ツアーを進められて、モチベーションを保ちやすかった。
Web上のPlayGroundの提供、紙の本の写経とかよりカジュアルに出来て良いのではないか。流行ってほしい。
失敗したところ
そんなこんなでノリノリでツアーの演習をこなしていた訳だが。
最後の #71 Exercise: Web Crawler で挫折した。
具体的には、演習内容をチャンネルだけで実装しようとして、どうしてもうまく行かなかった......。
多分 並行処理おじさん であれば余裕で書けただろうけど、ぼくは未熟なので、結局 こちらのブログ を参考にしてしまった。そうしたら sync.WaitGroup を使っている..... なにそれ......
ツアーとして、 「sync パッケージは役に立つ方法を提供していますが、他の方法があるので、Goではあまり必要ありません。」(参考)と言っているので、syncパッケージはノーチェックだった。でも実際のコードでは書きやすい方をえらんで使えば良いのでは、と同僚のGo並行処理おじさんもおっしゃってた。なんで、各パッケージについては一通り把握していこうと思った。ていうか英語版だと文言違うのかな...。
(というか、tour71の回答はWaitGroupを使ったとしても、mapがunsafeみたいなので微妙なんじゃないかと思っている... もっと良い書き方がありそうだ)
青果物
- 前半: https://gist.github.com/udzura/c907649e8a730c719b18
- 後半: https://gist.github.com/udzura/b9b22ce583cf641c2f52
皆さんもツアーで詰まったらご利用いただければ幸甚です。
これから
実は微妙にGoでの作りかけのツールがあったり、あと前も書いたようにmrubyとかcgoとか調べてみようかなあ、と言う気持ち。
福岡、 Fukuoka.go | Doorkeeper と言うコミュニッティーがあって便利なので適当にLTとか黙々会とかで参加したりしたい。