このドキュメントは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/tree
、 myname/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.Error
や t.Fail
といったエラー通知関数を呼び出すと、テストは失敗したと判断されます。もっと詳しい説明はgotestコマンドのドキュメント(未訳)、およびtestingパッケージのドキュメントをご覧ください。
なお、この*_test.go
ファイルは Makefile
内のリストに記述しないでください。
テストを実行するには、make test
またはgotest
を実行してください。(このふたつは同じことです) テストファイルをひとつだけ実行したいときは、たとえばone_test.go
であればgotest one_test.go
を実行してください。
コードの変更がパフォーマンスに影響を及ぼすようなときは、ベンチマーク関数(gotestコマンドドキュメントを参照)を追加したのち、gotest -benchmarks=.
を使って実行してください。
新しいコードをテストしてうまく動いたときが、レビューと投稿を行うタイミングです。
Comments