私が歌川です

@utgwkk が書いている

Kyoto.go #56 に参加し、「ゆるやかにgolangci-lintのルールを強くする」という話をした #kyotogo

kyotogo.connpass.com

参加し、登壇しました。発表資料はこちら。

speakerdeck.com

開発中のプロジェクトに導入しているgolangci-lintのルールをどうやって強くするか、というテーマでした。golangci-lintの設定について検索すると、disable-allしてからenableするという主張とenable-allしてからdisableするという主張が両方出てきます。間をとって、徐々にgolangci-lintの設定を強くしていくという選択肢もあるよ、そのために使えるgolangci-lintの設定項目やディレクティブ (マジックコメント) を伝授するよ、ということをまとめて発表させてもらいました。「linterが足枷になってはいけない、linterとうまく付き合うべき」というのが自分の主張です。

スライドの後半は、golangci-lintに関する雑多な話題をせっかくなのでまとめておくか、と思ったらめちゃくちゃ長くなった、というやつです。「トーク枠 (10分+Q&A)」で登壇して、残り半分は懇親会のテーマということにするか、と考えていたのですが、トーク枠の運用をゆるふわにしていただけたので結局ぜんぶ話せました。10分トーク+LT みたいな感じですね。

有効にしたいけどしていないlinter

この話を発表資料に盛り込むのを忘れていたので、記事として放出します。

bodyclose

http.Request 型のbodyが正しくcloseされていることを検査するlinterです。

テストコードが大量に引っかかるのでどうしたものか……と思っていったんペンディングにしています。

nilnli

(T, error) という多値を返す関数が nil, nil (値もエラーも nil) を返していないか検査するlinterです。

gqlgenのGraphQLリゾルバ実装を中心に return nil, nil というコードが多いため、いったんペンディングにしています。とはいえゼロ値を返してしまうと意図しないバグの元になりやすいので、隙を見て有効にはしたいですね。

perfsprint

fmt.Sprintf 関数よりももっとパフォーマンスの良いコードを提案するlinterです。

気持ちはわかるけど引っかかるコードが多いのでいったん置いてあります。

prealloc

予めlenやcapを確保していないスライス変数の定義を検出し、よりメモリ効率よく定義できないか提案するlinterです。

引っかかるコードが多いのでいったん置いてあります。

testifylint

github.com/stretchr/testifyというテストライブラリに関するlinterです。

引っかかるコードが多いのでいったん置いてあります。

おもしろかった

GoのGCについて、GOGC などのパラメータがあること以外は実はあんまり知らなかったし、世代別GCじゃないんだ〜という学びがありました。懇親会でも鹿さんと話していたと思うけど、arenaを有効活用するにはデータ構造に前提*1を置く必要があるのが大変そうですね。まだここがボトルネックにはなっていない (つもり) ので回避している……。

speakerdeck.com

面白さでいうと、命名をリントする話がなんだかんだで一番おもしろかったかもしれません。その発想はなかった、というのと、けっこう実用性を考えてlinterが実装されている、というののバランスがよかったです。

speakerdeck.com

来年も参加します。朝は起きてコンディションを調整する必要があると思うので、また次回のオフライン会で……。

あと、三条の山ちゃんに何気に初めて入店した気がします。

*1:structのフィールドにポインタを含めない、time.Timeを使わない、など