go buildと1バイナリ
go run と go build の違い
go run は翻訳と実行をまとめてやります。練習には便利ですが、動かすたびに翻訳し直しています。
go build は翻訳だけして、結果をファイルに残します。
プレーンテキスト
go build -o fleama-go main.gofleama-go という実行ファイルができます。あとはこれを直接動かすだけです。
プレーンテキスト
./fleama-go
fleama-go を起動します2回目以降は翻訳が要りません。起動が速くなります。
1バイナリという言葉の意味
Go のすごいところは、この1ファイルに必要なものが全部入っていることです。
プレーンテキスト
Node.js サーバーに node を入れる → node_modules を置く → コードを置く
Go fleama-go を置く。以上サーバーに Go を入れる必要すらありません。実行ファイルの中に、標準ライブラリも自分のコードも翻訳済みで詰まっているからです。
これが「1バイナリ」と呼ばれる状態です。配る手間、環境を合わせる手間、バージョンがずれる事故が、まとめて消えます。第9章でこれを実際にやります。
代わりに失うもの
翻訳を先にやるということは、書き間違いを実行前に全部直さないと動かないということです。
プレーンテキスト
./main.go:8:2: declared and not used: total「宣言したのに使っていない変数があります」という意味です。他の言語なら黙って動くところで、Go は止めます。
書いている最中は面倒に感じます。ですが止まるのは自分の手元であって、受講生や利用者の前ではありません。この順番を選んでいるのが Go です。
ファイルサイズ
全部入りなので、小さなプログラムでも実行ファイルは数 MB になります。
プレーンテキスト
main.go 200 バイト
fleama-go 2.3 MB驚く数字ですが、その代わりサーバー側に何も要りません。置いて動かすだけ、という手軽さと引き換えの大きさです。
要件
"go run"を渡したら翻訳と実行をまとめて行いますを返す"go build"を渡したら翻訳だけ行い実行ファイルを作りますを返す"./fleama-go"を渡したら出来上がった実行ファイルを直接動かしますを返す- そのどれでもないときは
分かりませんを返す
入出力例
buildStep("go run") → "翻訳と実行をまとめて行います"
buildStep("go build") → "翻訳だけ行い実行ファイルを作ります"
buildStep("./fleama-go") → "出来上がった実行ファイルを直接動かします"
buildStep("go test") → "分かりません"ヒント
編集 ゆめさく編集部