こんにちは、ASD熊本のKです。

最近業務でGO言語を触る機会があったのですが、
インデントは必ずタブでそろえるという慣習に少し苦戦していました。

GO標準フォーマッタであるgofmtは、スペースをタブに変換してくれるのですが、
既にスペースインデントでGitに上げてしまっていた場合は比較が多少面倒…といった具合です。

gofmtにタブを使わないオプションがないか調べたところ、
「gofmtは、-tab=falseオプションを使えばスペースでインデントしてくれる」
という記事を見かけました。しかし…

そんなオプションは知らんとGOに突き返されます。

まさかバグじゃないだろうなと本家のGitHubを覗いてみたところ、
バージョン1.3を境に-tabオプションが削除されていることを確認できました。
更にgofmtのコミットも確認したところ、理由とおぼしき記述が見られました。

私訳:
 これらのフラグを持つことは「gofmtされたはず」のコードとして容認してもいい、と誤解させます。
 組織がgofmtを内部的に異なる設定で使用したい場合、gofmtを簡単に変更することができますが、
 オープンソースのコミュニティが使用する “gofmt”では、この古いスイッチをサポートすべきではありません。
 -commentsフラグも削除します。

 ”cmd/gofmt: remove -tabwidth and -tabs flags・golang/go@014f3dc・GitHub”より引用
https://github.com/golang/go/commit/014f3dcc837cb6789076cff4fccaa3bd221f823e

この修正の経緯としては、Git上で”gofmtの-tabs、-tabwidthフラグは削除されるべき”
という旨のIssueが挙げられていたことから始まっていたようです。

意見のいくつかを要約すると…
・-tab,-tabwidthはGO言語の初学者を混乱させる可能性がある。
・-tab,-tabwidthされたコードは、gofmtを通したGO標準のコードとは言い難い。
・この機能を削除したところで、スペース派の心が変わることもないだろう。

 ”cmd/gofmt: remove -tabs and -tabwidth flags #7101″より引用
https://github.com/golang/go/issues/7101

GOはコード規約としてタブインデントを推奨しているためか、
オプションにより規約とのブレが生じるのはよくないと考えたようです。

オープンソースでは各人がコードを改変可能なこともあり、
書き方を統一させないと修正の差異が取りにくくなる事情が関係していると思われます。

結果バージョン1.2以降-tabオプションは廃止され、gofmtでスペースインデントはできなくなっています。
のっぴきならない事情でもない限りは、公式が推奨するようにインデントをタブで統一しましょう。

それでも、プロジェクトの内部事情などでスペースを使う必要がある場合は、
atom等エディタのプラグインで、editorconfigを使うという方法もあります。

例として、.editorconfigを以下のように定義することでタブの利用を回避できます。

 [*.go]
 indent_style = space
 indent_size = 2

gofmtをかけた後であっても、コマンドパレットから「EditorConfig: Fix File」を実行すればインデントをスペースに変更してくれます。

以上、gofmtのオプションで迷っていた方の参考になれば幸いです。