Slide 1

Slide 1 text

The Go gopher was designed by Renée French. 統一感のある Go コードを 生成 AI の力で手にいれる おーたかこーたろー / @otakakot 2025.06.11 GoConnect #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

おわり またどこかで お会いしましょう!