統一感のある Go コードを生成 AI の力で手にいれる
by
Kotaro Otaka
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
The Go gopher was designed by Renée French. 統一感のある Go コードを 生成 AI の力で手にいれる おーたかこーたろー / @otakakot 2025.06.11 Go Connect #7
Slide 2
Slide 2 text
Go コードに統一感をもたらすためには 静的解析は非常に強力な手段 #goconnect #goconnect
Slide 3
Slide 3 text
golangci-lint が活躍 #goconnect #goconnect https://github.com/golangci/golangci-lint
Slide 4
Slide 4 text
こんな経験ありませんか? #goconnect
Slide 5
Slide 5 text
#goconnect 対応箇所が多くて めんどくさい linter / formatter が 存在しない
Slide 6
Slide 6 text
こんな課題を解決するための 生成AIを使った取り組みをご紹介 #goconnect
Slide 7
Slide 7 text
Kotaro Otaka おーたかこーたろー / @otakakot #goconnect Web Engineer 新卒入社 Hello Golang! Web Engineer @株式会社ビットキー 2020.04 2021.04 2022.11 Go言語推し
Slide 8
Slide 8 text
#goconnect 前提 https://github.com/features/copilot GitHub Copilot を活用
Slide 9
Slide 9 text
INDEX 01 生成AIに修正させる 02 対 golangci-lint を作ってみる 03 独自 formatter を作ってみる 04 生成 AI のためにテンプレートを作る 05 独自 linter を作ってみる 06 まとめ
Slide 10
Slide 10 text
INDEX 01 生成AIに修正させる 02 対 golangci-lint を作ってみる 03 独自 formatter を作ってみる 04 生成 AI のためにテンプレートを作る 05 独自 linter を作ってみる 06 まとめ
Slide 11
Slide 11 text
#goconnect golangci-lint の指摘 直すのめんどくさいな
Slide 12
Slide 12 text
#goconnect そうだ!生成AIに直させよう! はい 直して
Slide 13
Slide 13 text
#goconnect golangci-lint v1.8.0 Long Length Liner 指定した文字数を 超えたら指摘 https://github.com/walle/lll
Slide 14
Slide 14 text
#goconnect サンプルコード
Slide 15
Slide 15 text
#goconnect golangci-lint を実行 このエラーメッセージを そのまま送信
Slide 16
Slide 16 text
#goconnect GitHub Copilot の回答
Slide 17
Slide 17 text
#goconnect GitHub Copilot の提案を適用
Slide 18
Slide 18 text
#goconnect ファイル単位での作業なので 時間がかかる トークンの消費も 多くなる
Slide 19
Slide 19 text
INDEX 01 生成AIに修正させる 02 対 golangci-lint を作ってみる 03 独自 formatter を作ってみる 04 生成 AI のためにテンプレートを作る 05 独自 linter を作ってみる 06 まとめ
Slide 20
Slide 20 text
#goconnect GitHub Copilot に修正コードを 書かせてみるのは?
Slide 21
Slide 21 text
#goconnect golangci-lint v1.8.0 Long Length Liner 指定した行数を 超えたら指摘 https://github.com/walle/lll
Slide 22
Slide 22 text
#goconnect 関数・メソッド & コメント 対応すべきは2パターン
Slide 23
Slide 23 text
#goconnect 関数・メソッド & コメント(before)
Slide 24
Slide 24 text
#goconnect 関数・メソッド & コメント(after) nolint:lll を付与 引数を改行
Slide 25
Slide 25 text
#goconnect GitHub Copilot に依頼 go/ast パッケージを使って
Slide 26
Slide 26 text
#goconnect 適応 → 修正を繰り返す はい 作って 直して
Slide 27
Slide 27 text
#goconnect ポイント コードは使い捨てと割り切る 完成度は8割程度でOK 複雑化をさけるためひとつの処理に集中
Slide 28
Slide 28 text
#goconnect そんなこんなで晴れて完成しましたが...
Slide 29
Slide 29 text
#goconnect すでに OSS ライブラリが存在
Slide 30
Slide 30 text
#goconnect golangci-lint v2.0.0 長い行を短縮 オプションで コメントにも対応 https://github.com/segmentio/golines
Slide 31
Slide 31 text
INDEX 01 生成AIに修正させる 02 対 golangci-lint を作ってみる 03 独自 formatter を作ってみる 04 生成 AI のためにテンプレートを作る 05 独自 linter を作ってみる 06 まとめ
Slide 32
Slide 32 text
#goconnect 独自の linter / formatter 欲しいな
Slide 33
Slide 33 text
#goconnect これも Copilot に書かせてみよう!
Slide 34
Slide 34 text
#goconnect 文字列リテラルを変換したい `` バッククォートを “” ダブルクォートに
Slide 35
Slide 35 text
#goconnect 一括置換では不可能 https://go.dev/ より抜粋
Slide 36
Slide 36 text
#goconnect GitHub Copilot に依頼 go/ast パッケージを使って
Slide 37
Slide 37 text
#goconnect 適応 → 修正を繰り返す はい 作って 直して
Slide 38
Slide 38 text
#goconnect サンプルコードだけだと精度が低い 実際に修正したいコードを使って試行錯誤 ポイント
Slide 39
Slide 39 text
#goconnect 独自の formatter の実装が可能に! ぱち ぱち ぱち
Slide 40
Slide 40 text
INDEX 01 生成AIに修正させる 02 対 golangci-lint を作ってみる 03 独自 formatter を作ってみる 04 生成 AI のためにテンプレートを作る 05 独自 linter を作ってみる 06 まとめ
Slide 41
Slide 41 text
#goconnect 毎回ゼロから作らせるの安定しないし 調整する時間もったいないな
Slide 42
Slide 42 text
#goconnect 以下のコードをテンプレート化 自動生成コード の除外 ファイルの フォーマット 対象ファイル or ディレクトリの指定 ファイルへの 書き込み vendor ディレクトリ の除外
Slide 43
Slide 43 text
#goconnect テンプレート化してみましたが ...
Slide 44
Slide 44 text
#goconnect すでにある仕組みだと気づきまして... ぴえん...
Slide 45
Slide 45 text
#goconnect https://pkg.go.dev/golang.org/x/tools/go/analysis
Slide 46
Slide 46 text
#goconnect https://engineering.mercari.com/blog/entry/2018-12-16-150000/
Slide 47
Slide 47 text
INDEX 01 生成AIに修正させる 02 対 golangci-lint を作ってみる 03 独自 formatter を作ってみる 04 生成 AI のためにテンプレートを作る 05 独自 linter を作ってみる 06 まとめ
Slide 48
Slide 48 text
#goconnect error のスコープ制限したいな
Slide 49
Slide 49 text
#goconnect before
Slide 50
Slide 50 text
#goconnect before err のスコープを限定できる
Slide 51
Slide 51 text
#goconnect after
Slide 52
Slide 52 text
#goconnect tenntenn さんが開発 静的解析ツールの スケルトンコード生成 初期化コードや テストコード https://github.com/gostaticanalysis/skeleton
Slide 53
Slide 53 text
#goconnect run 関数を修正させる
Slide 54
Slide 54 text
#goconnect 適応 → 修正を繰り返す はい 作って 直して
Slide 55
Slide 55 text
#goconnect 精度をあげる テストコード 増やして このパターンも 対応して はい
Slide 56
Slide 56 text
#goconnect error 変数の スコープを判定 if スコープに 閉じ込められるか指摘 よかったら 使ってみてね https://github.com/otakakot/errifscope
Slide 57
Slide 57 text
INDEX 01 生成AIに修正させる 02 対 golangci-lint を作ってみる 03 独自 formatter を作ってみる 04 生成 AI のためにテンプレートを作る 05 独自 linter を作ってみる 06 まとめ
Slide 58
Slide 58 text
#goconnect まとめ 生成 AI に修正させるのではなく 自動修正コードを書かせよう!
Slide 59
Slide 59 text
おわり またどこかで お会いしましょう!