Go 命令行ツール (Go CLI) 入門
Go 言語は、開発ワークフローを大幅に簡素化する非常に強力なコマンドラインツール(CLI)一式を提供しています。
本章では、最も核心となる 3 つのツール「go fmt」「go run」「go build」について深く掘り下げます。それぞれの機能、使用方法、そしてそれらがもたらす大きなメリットを包括的に解説します。これらをマスターすることで、よりクリーンで効率的、かつメンテナンス性の高い Go コードを記述できるようになります。
1. go fmt:コード自動フォーマットの神器
go fmt は、Go 公式のコードスタイルガイドに基づいてソースコードを自動的に整形するツールです。このガイドラインにより、世界中のすべての Go プロジェクトが視覚的に高度な一貫性を保つことが保証されます。go fmt を使用してコードを強制的に標準へ適合させることは、他人の読みやすさだけでなく、将来の自分自身のメンテナンスにおいても非常に有利に働きます。
1.1 なぜ go fmt を使用するのか?
- 絶対的な一貫性: プロジェクト全体、さらには Go エコシステム全体で統一されたコーディングスタイルを強制します。
- 極めて高い視認性: コードが読みやすく理解しやすくなり、認知負荷を大幅に軽減します。
- コードレビュー時間の節約: 「波括弧(ブレース)の配置」や「インデントはスペースかタブか」といったチーム内の不毛な論争に終止符を打ち、レビュアーが核心的なビジネスロジックに集中できるようにします。
- 完全な自動化: フォーマットプロセスを自動化し、時間と労力を節約します。
- 公式標準: 公式仕様に厳密に準拠し、ベストプラクティスを保証します。
1.2 go fmt の使い方
go fmt の基本構文は非常にシンプルです:
go fmt <ファイル名_または_ディレクトリ><ファイル名_または_ディレクトリ>: フォーマット対象を指定します。ディレクトリを渡した場合、go fmtはそのディレクトリ内のすべての.goファイルを再帰的に整形します。
例えば、main.go というファイルだけを整形したい場合:
go fmt main.go現在のディレクトリ内のすべての Go ファイルを整形したい場合(最も一般的なコマンド):
go fmt . 注意: go fmt は元のファイルを直接書き換えて上書きします。
1.3 フォーマット効果の比較
書き方が乱雑な Go ソースファイル example.go があるとします:
package main
import "fmt"
func main () {
fmt.Println("Hello, World!")
}ターミナルで go fmt example.go を実行すると、コードは一瞬でこのように整理されます:
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}変更点に注目してください:
- 演算子やキーワードの周囲に適切なスペースが追加されました。
- インデントが統一されました(Go はデフォルトでタブインデントを使用します)。
main関数の括弧の位置が修正されました。
1.4 goimports:より強力なアドバンスドツール
go fmt はコードの整形に特化していますが、さらに goimports という強力なツールがあります。これは go fmt のスーパーセットです。すべてのフォーマット機能に加え、import 文を自動的に管理します。足りないパッケージを自動で追加し、コード内で使用されていないパッケージを削除してくれるため、開発体験が劇的に向上します。
goimports をインストールするには、ターミナルで以下のコマンドを実行します:
go install golang.org/x/tools/cmd/goimports@latest使い方は go fmt とほぼ同じです:
goimports -w <ファイル名_または_ディレクトリ>-wフラグ(write)は、変更結果をソースファイルに書き戻すようgoimportsに指示します。
2. go run:即時コンパイルと実行
go run は、Go プログラムを素早くビルドして実行するための非常に便利なツールです。バックグラウンドでソースコードを一時ファイルとしてコンパイルし、すぐに実行します。日常的な開発テストや実験的なコーディングに最適です。
2.1 go run の使い方
基本構文は以下の通りです:
go run <ファイル.go> [引数...]<ファイル.go>: コンパイルして実行するメインの Go ソースファイルを指定します。[引数...]: (任意)プログラムに渡すコマンドライン引数です。
単一ファイルの実行:
go run main.go実行時にプログラムへ引数を渡したい場合は、ファイル名の後に直接記述します:
go run main.go 引数1 引数2 引数3これらの引数は、Go コード内で os.Args スライス(Slice)を通じて取得できます。
2.2 コマンドライン引数の読み取り例
以下の main.go ファイルを見てみましょう:
package main
import (
"fmt"
"os"
)
func main() {
// os.Args[0] はプログラム自体の名前なので、インデックス 1 から実際の引数を取得します
fmt.Println("受け取った引数:", os.Args[1:])
}ターミナルで go run main.go hello world を実行すると、以下の出力が表示されます:
受け取った引数: [hello world]2.3 複数のファイルの実行
プログラムが同じパッケージ内の複数のファイルに分かれている場合、go run はそれらを同時にコンパイルして実行できます:
go run file1.go file2.go file3.goファイルの並び順は通常問いません。Go コンパイラがスマートに依存関係を自動解析します。ただし、main パッケージに属するすべての関連ファイルを忘れずに含める必要があります。
3. go build:独立した実行ファイルのビルド
go run とは異なり、go build は Go ソースコードを真の意味で独立した実行用バイナリファイル(Executable binary)にコンパイルします。コンパイル後にプログラムが自動実行されることはありません。生成された実行ファイルは Go の開発環境に依存せず、他のユーザーに配布してそのまま実行させることができます。
3.1 go build の使い方
基本構文は以下の通りです:
go build [フラグ] [パッケージ名][フラグ]: (任意)ビルド動作を変更するためのパラメータ(例:-oで出力ファイル名を指定)。[パッケージ名]: ビルドするパッケージを指定します。省略した場合、go buildはデフォルトでカレントディレクトリのパッケージをビルドします。
現在のディレクトリで直接ビルドする:
go buildこれにより、ディレクトリ名(またはパッケージ名)と同じ名前の実行ファイルが生成されます。
出力ファイル名をカスタマイズしたい場合は、-o (output) フラグを使用します:
go build -o myprogramこれにより、myprogram という名前の実行ファイルが生成されます。
3.2 クロスコンパイル (Cross-Compilation) の切り札
go build はネイティブでクロスコンパイルをサポートしています!これは、Mac 上で Windows 用の .exe プログラムをビルドしたり、Windows 上で Linux サーバー用のプログラムをビルドしたりできることを意味します。これは Go 言語の極めて強力な機能であり、異なる OS を使用するユーザーへの配布を容易にします。
クロスコンパイルを行うには、go build を実行する前に 2 つの環境変数を一時的に設定するだけです:GOOS (ターゲット OS) と GOARCH (ターゲット CPU アーキテクチャ)。
例えば、Mac/Linux ターミナルから Windows (64bit) 用にビルドする場合:
GOOS=windows GOARCH=amd64 go build -o myprogram.exeLinux (32bit) 用にビルドする場合:
GOOS=linux GOARCH=386 go build -o myprogram3.3 ビルドと実行の例
main.go の内容が以下のようであるとします:
package main
import "fmt"
func main() {
fmt.Println("これはビルドされた独立したプログラムです。")
}ターミナルで go build を実行すると、現在のディレクトリに実行ファイル(Mac/Linux では main、Windows では main.exe)が生成されます。
この生成されたファイルは、go コマンドを使わずに直接実行できます:
./main # Linux / macOS での実行方法
main.exe # Windows での実行方法