このツールについて
Go フォーマッターは、Go のソースコードを Go コミュニティ全体で使われている唯一の標準スタイルに書き直します。ファイルやスニペットを貼り付けると、gofmt のインデント、スペース、import のグループ化、揃えられた構造体フィールドとコメントで整形されて返ってきます。
Go ツールチェーンの本物の gofmt を WebAssembly にコンパイルして実行しています。近似は一切なく、ここで表示されるものは go fmt が書き出すものとまったく同じなので、整形したコードをコミットしても CI で差分は出ません。
使い方
- Go のコードを貼り付けるか、
.goファイルを開きます。 - 入力に合わせて、整形されたコードが右側に表示されます。
- コミットするコードには タブ(gofmt) のインデントを使います。ドキュメント、スライド、タブが広すぎる表示になるサイトに載せる場合は スペース 2 つ または スペース 4 つ を選びます。
- 結果をコピーするか、ダウンロードします。
コードを解析できない場合は、expected ')', found '{' のように最初のエラーが行と列とともに表示され、その行にすぐ移動できます。
例
サンプルは、できるだけ少ない行に詰め込んだ短いプログラムです:import はセミコロンで区切られ、構造体は 2 行、関数の演算子の前後にはスペースがありません。整形すると次のようになります:
- import は括弧で囲まれたブロックになり、1 行に 1 パッケージずつ並びます。
- 構造体のフィールドはそれぞれの行に置かれ、型が列として揃えられます。
if u.Age<18{はif u.Age < 18 {になり、本体は独立した行に置かれます。- 複合リテラルではカンマとコロンの後にスペースが入ります。
gofmt が変更すること・しないこと
gofmt が変更するのはレイアウトだけです。識別子の名前変更、宣言の並べ替え、未使用 import の削除は決して行いません。それらは goimports や go vet などのツールの役割です。また、意味のある改行はそのまま残すので、複数行に分けた長い引数リストは分けられたままになります。
コメントは保持され、周囲のコードに合わせてインデントし直されます。連続する行の行末コメントは、構造体のフィールドと同じように列として揃えられます。
ヒント
- 整形は閉じ括弧の不足を見つける手軽な方法です。エラー位置はたいてい、間違いの直後の行を指しています。
- Issue やレビューでコードを共有する前にフォーマッターを通しましょう。レビュアーは見た目ではなく、コードが何をするかに集中できます。
- エディターで gopls の「保存時にフォーマット」を有効にすれば、ファイルが常にこの出力と一致します。
よくある質問
› これは本物の gofmt ですか?
はい。フォーマッターは Go ツールチェーンの gofmt のコードを WebAssembly にコンパイルしたものなので、出力は手元のマシンで `gofmt` や `go fmt` が出力するものとバイト単位で一致します。
› package 句は必要ですか?
いいえ。ファイル全体が理想的ですが、gofmt は宣言の並びや数行の文も受け付けます。ブログ記事やチャットからコピーしたスニペットに便利です。
› インデントにタブが使われるのはなぜですか?
gofmt は常にタブでインデントし、スペースで位置を揃えます。これが Go の慣習で、エディターではタブを好きな幅で表示できます。ドキュメントやスライド用にスペースが必要な場合は、スペース 2 つまたは 4 つを選ぶと、行頭のタブだけが置き換えられます。
› コードはアップロードされますか?
いいえ。WebAssembly モジュールは一度だけダウンロードされ、整形はブラウザ内でローカルに実行されます。