blue_field

技術的なメモとか読書記録とかいろいろ(の予定

Golangを触り始めた

タイトルの通り、ほんとに触り始めたという程度だけど。。 速いと聞くし、Rails以外の選択肢としてGo製のWAFもそのうち触ってみたいな〜と思っている。

http://golang.org

f:id:yusuke_1031:20141020123314p:plain

インストール

もともとMacpecoghqといったコマンドラインツールを利用していたので、homebrewでのGoインストール、GOPATHの設定くらいはしていた。

zshにpeco + ghqを導入したメモ

$ 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のパッケージ側にちょろっと設定をすれば、ファイル保存時にフォーマットしてくれたりするようになる。とりあえずのところはこれで大丈夫かな。

ATOMでGolangの環境設定

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にどこまでパワー割けるか分からないのだけれど、引き続き学んでいきたい。