Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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
おわり またどこかで お会いしましょう!