このドキュメントはHow to Write Go Code(http://golang.org/doc/code.html)の翻訳です。
今回は文章が短かったので、分割せず一回で翻訳しました。


はじめに

このドキュメントでは新しいパッケージの作成方法、およびテスト方法について説明します。インストール手順に従いGo言語のインストールが済んでいることが前提となっています。

既存のパッケージに変更を加えるか、もしくは新しいパッケージの作成に取り掛かる前には必ず、あなたが何をしようとしているのかを他の人達に知らせるためにメーリングリスト宛にメールを送るようにしてください。そうすることで重複による無駄な労力が減らせるとともに、コードを書く前に仕様に関する議論をすることができます。

コミュニティ リソース

リアルタイムサポートは、Freenode IRCサーバの#go-nutsチャネルにて。

Go言語の公式ディスカッション用メーリングリストは Go Nutsにて。

バグの報告はGo issue trackerまで。

開発の状況を知りたい方は、別のメーリングリストgolang-checkinsにてGoリポジトリの個別のチェックイン情報のサマリーが受け取れます。

新しいパッケージの作成

インポートの際に使用されるパスが x/yとなるパッケージのソースコードは、慣例によってディレクトリ$GOROOT/src/pkg/x/yに格納されます。

Makefile

ソースファイルをチェックしてどれをどの順番でビルドすべきか判断するようなGo言語の仕様と合ったツールがあればよいのですが、現時点でGo言語ではGNU makeを使っています。新しいパッケージディレクトリに最初に作成するファイルは、通常は上で述べたMakefileになります。Goソースツリーで使われている標準的なMakefileとしてsrc/pkg/container/vector/Makefileを参考にしてください。

include ../../../Make.$(GOARCH)

TARG=container/vector
GOFILES=\
	intvector.go\
	stringvector.go\
	vector.go\

include ../../../Make.pkg

Goソースツリーの外(私的なパッケージ)での標準的なMakefileは次のようになります。

include $(GOROOT)/src/Make.$(GOARCH)

TARG=mypackage
GOFILES=\
	my1.go\
	my2.go\

include $(GOROOT)/src/Make.pkg

最初と最後の行では、標準的な定義とルールをインクルードしています。各パッケージでは$(GOROOT)/srcとする代わりに相対パスを使って標準Goツリーにアクセスしているので、$(GOROOT)にスペースが含まれていても正しく動作します。これはGo言語を初めて触るプログラマに役立ちます。

TARG はこのパッケージのターゲットとなるインストールパスであり、クライアントがこのパッケージをインポートするときに使う文字列です。Goツリー内では、この文字列はMakefile が置かれているディレクトリ名と同じでなければなりませんが文字列の前に$GOROOT/src/pkg/は不要です。Goツリー外では、標準Goパッケージの名前と重ならなければ好きなTARG が使用できます。一般的には、自作パッケージのグルーピングに使用しているトップレベルの名前を使います(myname/treemyname/filterなど)。自作パッケージをGoツリー外で管理するときも同様に、make installを実行すると標準インストール先である$GOROOT/pkgにパッケージのバイナリがインストールされるようにしてください。このようにすると、あとで探しやすくなります。

GOFILES はパッケージを作成するためにコンパイルするソースファイルのリストです。行末の文字\はリストを複数行に分割して、並び替えやすくするためのものです。

Goツリー内に新しくパッケージ用ディレクトリを作成するときは、標準ビルドに組み入れるために、そのディレクトリを$GOROOT/src/pkg/Makefile 内のリストに加えてください。それでは、実行してみます。

cd $GOROOT/src/pkg
./deps.bash

これを実行するのは依存関係ファイルMake.depsを更新するためです。(make all またはmake buildを実行したときには自動的に行われます。)

既存パッケージのインポートを変更したときは、$GOROOT/src/pkg/Makefileの変更は不要ですが、上のdeps.bashの実行が必要です。

Go言語のソースファイル

Makefile 内にリストされている各ソースファイルの先頭ステートメントはパッケージ名でなければなりません。またその名前はパッケージがインポートされるときに使われるデフォルトの名前であり、同一パッケージ内のすべてのファイルで同じ名前を使わなければなりません。Go言語では慣習的に、パッケージ名はインポートパスの最後の要素であり、"crypto/rot13"としてインポートされるパッケージはrot13という名前になります。いまのところGo言語のツールの制約として、リンクされてひとつのバイナリとなる各パッケージの名前はユニークでなければなりませんが、いずれこの制約はなくなります。

Go言語では、ひとつのパッケージのソースファイルを一度にまとめてコンパイルするので、特別な決め事や宣言をすることなく、とあるファイルから別ファイル内の定数、変数、型、関数を参照することができます。

Goコードの簡潔かつ慣用的な書き方については、このドキュメントの範囲外ですので、実践Go言語(Effective Go)をご覧ください。

テスト

Go言語にはgotestと呼ばれる軽量のテスト用フレームワークがあります。テストを記述するには、ファイル名の後ろに_test.goが付いたファイルを作成し、そこにシグネチャfunc (t *testing.T)を持つTestXXX という名前の関数を記述します。テストフレームワークがこれらの関数をそれぞれ実行します。その関数内でt.Errort.Failといったエラー通知関数を呼び出すと、テストは失敗したと判断されます。もっと詳しい説明はgotestコマンドのドキュメント(未訳)、およびtestingパッケージのドキュメントをご覧ください。

なお、この*_test.goファイルは Makefile内のリストに記述しないでください。

テストを実行するには、make testまたはgotest を実行してください。(このふたつは同じことです) テストファイルをひとつだけ実行したいときは、たとえばone_test.goであればgotest one_test.goを実行してください。

コードの変更がパフォーマンスに影響を及ぼすようなときは、ベンチマーク関数(gotestコマンドドキュメントを参照)を追加したのち、gotest -benchmarks=.を使って実行してください。

新しいコードをテストしてうまく動いたときが、レビューと投稿を行うタイミングです。