World!")}ビルドして実行可能ファイルを作成します。hello_go.goこれでhello_cとhello_goの2つの実行可能ファイルが作成されました。World!"と表示するだけの極めて単純なプログラムです。ここで作成された実行可能ファイルに大きな違いがあります。このようにCバージョンもGoバージョンもソースコードのサイズこそ似たようなものですが、生成されたバイナリのサイズに大きな違いがあります。Goが生成したバイナリはCバージョンのそれに比べてなんと250倍のサイズがあります。この理由について調べるためにLinuxのELF形式の実行可能ファイルの内部情報を覗くツール"readelf"を使ってみましょう。hello_goこのファイルには動的セクションがありません。Cバージョンのプログラムでは共有ライブラリlibc.so.6への依存が表示されますが、Goバージョンでは「動的セクションが無い」というあっさりとした表示で完了します。実行時にlibc.so.6を動的に使用するかビルドしたバイナリ内に必要な静的ライブラリ全てを組み込むかの差が実行可能ファイルのサイズ差となって現れているわけですね。ここで理解できるのはGoはその設計方針としてOSの中核をなすような基本的なライブラリ群にすら依存しないように構成されているということです。言い換えるならばOSにインストールされているライブラリ群が古かったり新しくなって互換性が損なわれた場合にもGoの動作にはいささかも影響を与えないということです。「車輪の再発明」になろうとも環境の違いをものともしない一貫性とポータビリティが最重要視されているとも言えるでしょう。http.Get("http://example.com/")}importする対象に"net/http"というHTTPプロトコルを操作するためのパッケージを追加して適当なURLの内容をGETする操作を付け加えています。これを先ほどの手順と同じようにビルドしてみます。ほんの数行の追加ですが先ほどの2.2MBから7.1MBと盛大にサイズが大きくなりました。これは"net/http"というパッケージへの依存性が追加されたため、今回のわたしの実験環境であれば、/usr/local/go/pkg/linux_amd64/net/http以下に配置されている静的ライブラリが実行可能ファイル内に組み込まれたことを表しています。goでビルドされたバイナリにどのようなライブラリが組み込まれているかについては先ほどと同様にreadelfを使ってシンボルテーブルを覗くことで調べることができます。runまずはgoによるビルド方法を挙げてみましたが毎回毎回ビルドするのは明らかに面倒です。goではビルドから実行までの流れをサブコマンド"run"を使うことで一発で処理できます。World!各種スクリプト言語と同等ぐらいに簡便ですね。test"で実行することができます。その実行単位はgoのパッケージ単位で動作するためいくつかのルールに従う必要があります。ここではシンプルな計算のための関数を含んだmymathパッケージを作成してそのテストを行う手順について記してみます。mymathパッケージの本体です。$GOPATH/src/mymath/mymath.goにソースファイルを保存します。わたしの環境では$HOME/go/src/mymath/mymath.goに配置されることになります。n}ちなみに任意のpackage以下で定義された関数はその名前が英大文字で始まる場合にpublicな関数として扱われパッケージ外より呼び出すことが可能になります。関数名の先頭が英小文字である場合はprivateな関数となります。mymath.goと同じディレクトリに下記のテストファイルを配置します。"[パッケージ名]_test.go"というファイル名にして配置する必要があります。この場合は、$GOPATH/go/src/mymath/mymath_test.goですね。t.Error("error")}テスト対象のパッケージと同じパッケージに所属していることに注意してください。テストを実行するためのtestingパッケージのimportが必要で、各テストの関数名をTest*より開始することでテスト関数であると認識されます。各テスト関数はtesting.Tという型の引数をとります。Testにあるようなassertionといった機能は提供されておらず、testing.T型の引数に対してError()、Fatal()といった関数を使って適宜テストの失敗を報告する構成になっています。上記2ファイルを規定の場所に保存していよいよテストを実行することができます。test"に指定するのはファイルやディレクトリではなくパッケージ名であることに注意してください。0.001s意図的にTestPower2()が失敗するように書いたためTestPower2がFAILした旨が表示されましたが、テストの実行自体は成功しています。パスしたテストも表示するにはオプションに-vを追加します。0.001sパスしたテストの内容も表示されるようになりました。go1.2からはテストのcoverage測定もオプションで指定できるようになりました。テストが失敗するとcoverageの出力ができないためテストコードに手を入れて全てのテストがパスするように書き換えます。t.Log("pass")}coverage測定のためのオプション、-coverを付加して実行してみましょう。statements"が表示されるようになりました。"-cover"オプションに留まらず、CPUのプロファイル情報のための"-cpuprofile"、各テストを並列実行するための"-parallel"など有用なオプションが色々と用意されています。testflag"で参照することができます。continued今回はGoの環境設定から中心となるツールについての概観を行ってみました。(2)」では例え他言語に精通していたとしても引っかかりがちなgoの言語機能について解説してみたいと思います。