コンテンツにスキップ

Go/gofmtコマンド

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

gofmt

[編集]

何をするツールか

[編集]

Go の公式コードフォーマッタです。インデント・スペース・括弧の位置など、コードのスタイルを自動的に統一します。

go vet が「バグの可能性」を検出するのに対し、gofmt は「見た目の統一」を行います。

基本的な使い方

[編集]
gofmt main.go          # フォーマット結果を標準出力に表示
gofmt -w main.go       # ファイルを直接書き換える
gofmt -w .             # カレントディレクトリ以下を全て書き換える

フラグ解説

[編集]

-w:ファイルを直接書き換える

[編集]
gofmt -w main.go

指定しない場合は標準出力に結果を表示するだけで、ファイルは変更されません。実運用では -w を使うのが一般的です。

-d:差分を表示する

[編集]
gofmt -d main.go

diff 形式でフォーマット前後の差分を表示します。ファイルは変更されません。CI でフォーマットチェックをする際に有用です。

-func foo(){
+func foo() {

-l:フォーマットが必要なファイルを列挙する

[編集]
gofmt -l .

フォーマットが必要なファイルのパスだけを表示します。CI でのチェックに使います。

# CI でのチェック例
# 出力が空なら全ファイルが整形済み
test -z "$(gofmt -l .)"

-s:コードを簡略化する

[編集]
gofmt -s -w .

冗長な書き方を簡潔な形に変換します。

// 変換前
s[a:len(s)]           s[a:]
[]T{T{1}, T{2}}       []T{{1}, {2}}
for x, _ = range v    for x = range v

-r:書き換えルールを適用する

[編集]
gofmt -r 'a[b:len(a)] -> a[b:]' -w .

旧パターン -> 新パターン の形式で、コード全体に対して書き換えを適用します。簡単なリファクタリングに使えます。

# 関数名の変更
gofmt -r 'OldFunc(a) -> NewFunc(a)' -w .

# 型の置き換え
gofmt -r 'interface{} -> any' -w .

-e:全エラーを表示する

[編集]
gofmt -e main.go

デフォルトでは各行の最初の1つのエラーしか表示されませんが、-e を指定すると全エラーを表示します。

-cpuprofile:CPU プロファイルの書き出し

[編集]
gofmt -cpuprofile cpu.prof main.go

gofmt 自体のパフォーマンス計測用です。通常の開発では使いません。

go vet との使い分け

[編集]
ツール 目的 自動修正
gofmt コードスタイルの統一 -w で自動修正
go vet バグの可能性の検出 一部のみ

CI での典型的な使い方

[編集]
# フォーマットチェック
test -z "$(gofmt -l .)" || (echo "要 gofmt" && exit 1)

# フォーマット + vet を両方かける
gofmt -w . && go vet ./...

まとめ

[編集]
フラグ 用途
-w ファイルを直接書き換える(実運用の基本)
-d diff 形式で差分表示(ファイル変更なし)
-l 要フォーマットのファイル名を列挙(CI 向け)
-s 冗長な書き方を簡略化
-r 書き換えルールを適用(簡易リファクタリング)
-e 全エラーを表示

Go では gofmt を使うことで、コーディングスタイルの議論に永遠にカロリーを使わずに済むようになりました。インデントはタブかスペースか、括弧はどこに置くか——他の言語では延々と続くこれらの議論が、Go では最初から存在しません。