Goを用いたAI駆動開発のための開発環境整備: gofumpt 編
Goのフォーマッター「gofumpt」について解説します。
生成されたコードのチェックを自動化しよう
生成AIを使ってコーディングを自動化すると開発作業を大きく効率化することができます。しかし一方で、レビューの負担という新たな問題も生じています。 生成されたコードの品質は一般にまちまちで、差があるものです。これらを全て人力で修正していたのでは多大な時間がかかってしまい、せっかくAIで効率化した意味が減殺されてしまいます。チェックと修正自体も自動化しないといけないわけです。
コードスタイル(フォーマット)を機械的にチェック・修正できるフォーマッタは、生成AIが活躍するようになった現在においても大いに威力を発揮します。コードスタイルの些細な違いは動作に影響しませんが、可読性や保守性の観点からぜひ統一したいものです。
「フォーマッタが正しい」で割り切る簡便さ
また開発プロジェクトからはまだまだ人が完全にいなくなったわけではありません。チーム開発となると複数名の開発者が参加します。このときコードスタイルをどのように決めるかは悩ましい課題となりがちです。
コードスタイルには個々の好みが出ます。括弧の位置や空行の入れ方程度のことですら個々の「こうしたい」があるのです。プロジェクトの都度合意を得るために何度もやりとりするのも大変です。それらをそれぞれが譲らず自分の好みで書き始めると収拾がつかなくなってしまいます(そしてそうなったのであろうコードを見ることも時折あります)。
その点「フォーマッタが正しい。以上」で決めてしまえば公正です。あらかじめ決まったルールを使えばいいため議論の必要もありません。しかも自動でコードスタイルを整えてくれるため、レビューの際に些細な改行の違いなどを見つけるために目を皿のようにする必要もなくなります。ただCIでフォーマッタの実行を保証すればよいだけになるのです。
標準を超えた整形ルールを提供するgofumpt
そのようなわけで、Goの開発環境を整えるための施策の一つとして、フォーマッタ「gofumpt」を導入します。これはよりリッチになったgofmt
と考えればよく、より厳格で豊富なフォーマットルールを適用します。例えば次のような処理をしてくれます。
- 括弧位置の統一
- 不要な空行の削除
- コメントの余白の修正
詳細は公式に紹介されているため、気になる方はそちらをご参照ください。
シンプルな導入手順と基本的な使い方
gofumptのインストールは以下のコマンドで行えます。ここでは簡単なlatestで紹介していますが、プロダクト用途なら意図せぬ動作変更がないようバージョンを指定したほうが安定します。
# プロダクト用途ならバージョン指定を推奨
go install mvdan.cc/gofumpt@latest
以下のコマンドでファイルをフォーマットできます。
# 単一ファイルのフォーマット
gofumpt -w main.go
# ディレクトリ内の全Goファイルをフォーマット
gofumpt -w .
ワークフローを記したファイルにコマンドを記載しておけば、AIエージェントがよろしくやってくれるはずです。ただし確実に行われることを保証するためCIにも組み込むほうがよいです。
実行例
どのようなフォーマットが行われるのかご紹介します。まずこちらはgofumptを適用する前のコード。
整形前のコード(sample_before.go):
package main
var V interface {
} = 3
type T struct {
}
func foo() (any, error) {
return nil, nil
}
func bar() {
_, err := foo()
if err != nil {
return err
}
}
それが処理をかけるとこのようになりました。