Golangを触り始めた
タイトルの通り、ほんとに触り始めたという程度だけど。。 速いと聞くし、Rails以外の選択肢としてGo製のWAFもそのうち触ってみたいな〜と思っている。
インストール
もともとMacでpecoやghqといったコマンドラインツールを利用していたので、homebrewでのGoインストール、GOPATHの設定くらいはしていた。
$ brew install go $ go version go version go1.3.3 darwin/amd64 $ echo $GOPATH /Users/Aono
触ってみる
何を教材にしようかなと思っていたのだが、WEB+DB PRESS Vol.82 のGo特集が良さげだったので、それを見ながら書いている。
Hello world
よく分からないまま、とりあえずハローワールド。
外部のパッケージとか呼び出す、本元というかメインのファイルにpackage main
と書くのかな。
/* hello.go */ package main import ( "fmt" ) func main() { fmt.Println("hello world") }
$ go run hello.go hello world
コンパイルしてバイナリファイルにするには、
$ go build hello.go
同じディレクトリにhello
という実行ファイルが生成される。
$ ./hello hello world
結構厳しいコーディング規約
インデントがハードタブじゃないといけない。 あと、文字列をシングルクオーテーションで括ったらエラーが出た。 シングルクオーテーションで括るとルーンリテラルとなり、ダブルクォーテーションの時の文字列リテラルとは別物のようだ。
Golangには、この規約に従ってコードを整形してくれるコマンドが標準で付いている。
$ go fmt hello.go
Goフォーマットすると、ソフトタブ(半角スペース)がハードタブになるなどの変換が行われる。
Atomのプラグイン
毎回上記のコマンドを実行しなくても済むように、各エディタで拡張機能があるっぽい。 Atom Editorにもgo-plusというプラグインがあったので、それを利用。
Goのパッケージも必要みたいなので、go get
しておく。
$ go get code.google.com/p/go.tools/cmd/goimports $ go get github.com/golang/lint/golint
こうしてgo get
したパッケージは、$GOPATH/src
以下にインストールされていく。
実行ファイルは$GOPATH/bin
下に入るようなので、PATHを通しておいた。
これでAtomのパッケージ側にちょろっと設定をすれば、ファイル保存時にフォーマットしてくれたりするようになる。とりあえずのところはこれで大丈夫かな。
godocコマンド
パッケージのドキュメントを見るコマンド。 なんか雑誌の中ではさらっと使っていたのですが、僕のMacだとこのコマンドが最初使えなかった。
別途インストールが必要?みたい。
$ go get code.google.com/p/go.tools/cmd/godoc
これを実行した後も、$GOPATH/bin
下にgodoc
はなかった。
以下の記事を参考に、/usr/local/opt/go/libexec/bin
にもPATH通したら使えるようになった。
これで合ってるのかな...
godoc with homebrew installed Go
ちなみにタイミングを忘れてしまったのだけど、go get
の際、mercurialが入ってないのでコード取ってこれないぞ、と怒られた。homebrewでインストールした。
以下のようなコマンドで、ドキュメントを見れるようになった。
$ godoc fmt
Goのディレクトリのお作法とか
基本的に、
$GOPATH ├── bin ├── pkg └── src
というディレクトリ構造で開発していくようだ。分かりやすい。
今のところは、src
のみにフォーカス。src
下に実際に書いていくコードを格納する。
GitHub上に置いてある(置く予定の)ソースコードは、$GOPATH/src/github.com/<ユーザー名>/<リポジトリ名>
に設置して作業していく。ghq
を利用してソースコードを取得したりしていたのもあり、そんなに混乱はしなかった。
以下、またサンプルコード。
/* $GOPATH/src/github.com/ysk1031/gosample/gosample.go */ package gosample var Message string = "hello world"
/* $GOPATH/src/main/main.go */ package main import ( "fmt" "github.com/ysk1031/gosample" ) func main() { fmt.Println(gosample.Message) }
mainパッケージ側で、自作した外部のパッケージをインポートしている。
インポートの際は、$GOPATH/src
より下のファイル名を指定すれば自動で解釈してくれるようだ。
最後にパッケージのビルド。
さっきは、go build
でその場に実行ファイルを生成したが、今回はgo install
を利用。
$ cd $GOPATH/src/main $ go install
実行すると、$GOPATH/bin
下に実行ファイルmain
が生成される。なるほど!
すでに$GOPATH/bin
にPATHを通してあるので、コマンドラインのどこからでも、main
というコマンドを実行することができるようになった。
$ main hello world
Atomのところでgolintをgo get
でインストールした際、$GOPATH/bin
以下に実行ファイルも生成されていた。go get
は、$GOPATH/src
下にソースを持ってきた後go install
を実行している、という認識で合っているのかなあ。
おわり
今回はいったん終わり。 Web+DBの記事は非常に分かりやすく書かれていて、苦しまずに読み進めていけそう。
会社の方でSwiftも書く必要が出てきそうで(こちらも初心者)、Goにどこまでパワー割けるか分からないのだけれど、引き続き学んでいきたい。