鳩舎

レースしない

golang を始めた時

そういやまだ新しい経験だから覚えてるし、 golang を勉強していった過程を書いておく。

正しさとかは気にせず、動くものが出来るまでがむしゃらに。

Hello, world まで

特にひねりはない。 homebrew は便利だ。

$ brew install go
$ cd ~
$ mkdir -p go/src/hello_world
$ export GOPATH=${HOME}/go
$ cd go/src/hello_world
$ cat main.go
package main

import "fmt"

func main() {
  fmt.Println("hello, world")
}
$ go run main.go
hello, world

手軽。

入門、そして組み込みパッケージを使う

http://golang.org/pkg/ に組み込みパッケージの一覧があるので参照する。だいたいここ見ればどういう引数を与えるべきかがわかる。

まずもって golang のことを知らないので見てもさっぱりわからない。苦痛。なので http://tour.golang.org/ をやる。

なるほど〜。こんな感じなのか〜。わかんね〜。http://golang.org/doc/code.html を読む。正直いきなり REPL っぽいことさせられるよりわかりやすい。ああ、こういうディレクトリ構成が普通なのね、とかすんなりわかる。

さっきの "fmt" とかは fmt パッケージなのか、とかもこの辺でやっとわかってくる。まだこの辺では import はおまじない状態だ。 package main の意味もよくわかってない。

GOPATH 以外でコードを書く

GOPATH の中に引きこもるのが嫌すぎるのでどっかべつのとこでやりたい。

go/pkg/ ... のパスから package を探すようなので、src から外れても実は問題なくコードは書ける。問題はパッケージの import だけで、外部のライブラリを使う分には gondler で解決出来る。では自作のローカルパッケージをどうするかになる。

たとえば以下の様な構成の場合。

  • project
    • main.go
    • mylib
      • mylib.go

この時、 main.go から mylib パッケージを使いたい。

import "./mylib" で解決した。なんてことはない。相対パスかけばいいだけだった。

外部ライブラリは gondler で、ローカルパッケージは相対パスで食わせればオッケーとおぼえておくと人生が楽になる。

自分の Github に上がっているような、別リポジトリの場合は gondler に任せるのがよい。 gondler の使い方は次。

Gondler 使う

$ gem install gondler

もしくは

$ cat Gemfile
group :development do
  gem 'gondler'
end
$ bundle install
$ bundle exec gondler

のように使う。 Gemfile でバージョンを固定しておくと各メンバーの gondler のバージョンを固定出来てよい。 gondler はまだ 0.x.x なので固定しておかないと非互換な変更が入る可能性があることを考慮しておくとよい。

あとは Gomfile を書くだけ。

$ cat Gomfile
package 'github.com/golang/glog'

難しさは特にないと思うがどうか。

ここまで来ると

なんとなくいろいろ書ける気がしてくる。普通の executable なものを作る分にはこれで大抵問題なくなる。

revel とか使うともっと制限がかかって大変だけど、使う人は頑張って欲しい。僕は revel 使うのだるすぎるし結局省力化されてない気がしたのと、別に golang ででかい Web アプリ書きたくなかったという大前提に直面して使うのやめた。

いいコードを探す

読んだりしたコードは多分そこそこあるんだけど、Github の Explore で go の Trending Repos とか読むのがよい。 vegeta あたりは小さくて読んでてためになる。

チャネルの使い方とか難しいから、自分で書きつつ人のコード見て使い所検討するのがよい。僕は未だに慣れてない。

ドキュメントを探す

外部パッケージは大抵 godoc.org でドキュメント化出来るようにコメント書いてある。コメントなくても引数名と型で大抵のことはなんとなくわかる。より詳細を知りたければコードを読むしかないが、これは Ruby の世界もそんなもんだし、結局コード読むからまあいい。許した。

Dash で go の package とかはローカルに落としておけるので使うのがおすすめ。ドキュメントは何度も読み返すことになる。いつもおもうけどこのへんの暗記ゲーだけなくなってほしい。僕は暗記苦手だから多分コード書いてる時間で一番 Dash を開いてる。

Dash 使ってない人は普通にブラウザから読むといいと思うけど、Dash の方が便利だと思う。理由はこれ。

Functions とかが出るのが便利。あと HUD モードで Global shortcut 設定しておくとすぐ呼び出せる。

vim の設定とか

http://qiita.com/todogzm/items/3c281da10287f7383487 この辺り読むといい。もともと補完に頼らない派の人間なので :Fmt と :Import ぐらいしか使ってない。

:Import の補完候補には GOPATH 以下にある pkg も対象になるけど、 gondler だとこの辺がサポートできてないので、ちょっと考えないといけない。

よりよいコードを書くために

あと触れてないのなんだろ、楽なテスト手法とかかな。僕は testing しか使ってないからわからない。"testing/quick" とかもあるけど、あれあんまクイックになってないと思う。 gocode とかで補完されると便利なのかもしれない。

結構世の中には golang の勉強会があるようで、そういうところで発表された資料とかも転がってる。あとはよく見てる所。

他にも読んでるけど、今思いついたのがこれだけだった。各位すいません。

他にも『ここで詰まってる』とか具体的な話されると答えられることあるかもしれないけど、わかんない。ちなみに現状まで大体2ヶ月くらいだと思う。始めたの9月ごろだったはず。