YAMAGUCHI::weblog

海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。

Go Language Getting Started 2012.12

はじめに

こんにちは、Go界の木村功です。このエントリはPySpaアドベントカレンダーの20日目の記事です。

「最近Goを書いてるよ」と言うとGoがまだVersion 1.0になる前にちょっと触った時の印象で反応される方がちょいちょいいるので、いまからGoを始める場合のメモを残しておきます。

言語チュートリアル系

チュートリアル動画


これをひと通り見ておけば必要な環境が設定できます。

インタラクティブチュートリアル

とりあえず文法を覚えたいのであれば、GoをインストールしなくてもA Tour of Goをやっとけば良いと思います。

Go Playground

JavaScriptで言うところのjsdo.itやjsFiddleのようなものです。ブラウザ上でGoの標準パッケージだけで書ける範囲のコードを色々と試して、そのコードをシェアも出来るという環境です。A Tour of Goが終わった後に更にちょっと遊んでみたいだけであればこれで十分。A Tour of Goで使っているものと同じ仕組みです。

環境設定系

インストール

Go公式サイトのGetting Startedにまとまっています。

特に設定で気をつけるのは次の環境変数くらいだと思います。

  • GOROOT: Goの実行バイナリをインストールする先のターゲットディレクトリ
  • GOPATH: 開発時のルートディレクトリ
ワークスペース

Goで何かを書き始める場合はプロジェクトごとにワークスペースを分けて、そこにGOPATHを通しておきます。詳しくは次のリンク参照。

下の例の場合は GOPATH=path/to/project になります。さらにワークスペースの中にsrcディレクトリを切って、その中でコードを書いていきます。go getとかしたコードもこのsrcディレクトリの中にダウンロードされます。GitHubに登録するのもこのsrcディレクトリだけです。

% tree path/to/project 
path/to/project
├── README
├── src/
│       ├── main.go
│       ├── github.com
│       │        └── ymotongpoo
│       │                   └── spam
│                                          ...
├── pkg/
└── bin/

ワークスペースに入ったらとりあえず次のコマンドを叩いておくと幸せです。

% godoc -http=":8000" &

これでhttp://localhost:8000にアクセスして実装中のコード含めてドキュメントが読めて、ローカルでの開発がはかどります。

パッケージ

Goはパッケージ管理レポジトリのようなもの*1がありません。ただ、Git、Mercurial、Bazaar、Subversionレポジトリをgo getで直接引っ張ってこれるので、今のところは自分で頑張って探すというのが主流です。
とは言え、それはめんどくさいので、一応Goの3rd Partyライブラリがまとめられているサイトがあります。

データ処理系

XML/JSON/CSV

標準パッケージを使えばそれなりに色々なことができます。

protocol buffer

C++Pythonで使うようにprotocol bufferをインストールした上に、Go用のgoprotobufをインストールしてやる必要があります。

CLIアプリケーション

標準パッケージのflagを使って、オプションの処理も柔軟に出来ます。

Webアプリケーションの作成

Goは標準パッケージにHTTPサーバ、URLディスパッチャ、テンプレートエンジンを持っているので、DBの部分さえなんとか出来れば、バイナリ1個のWebアプリケーションを作ることも可能です。しかもそこそこ速い。

一応3rd Partyだけどそこそこ動くMySQLクライアントライブラリなんかはあります。

テスト

ユニットテスト

ユニットテストも標準パッケージでできます。xUnit形式のログが吐けないのでJenkins等との連携はめんどうかも。でもTravis-CIでも簡単にGoのテストを動かすことができます。またQuickCheckもどきも入っているので、ブラックボックステストも割と簡単にできます。

mock

インターフェースだったらgomockを使ってmockの作成が可能。

参考

参考にするサイトなど。

情報収集中なので、おそらくまだ加筆されます。

*1:PerlCPANPythonPyPIRubyRubyGemsHaskellのHackageなど