参加し、登壇しました。発表資料はこちら。
開発中のプロジェクトに導入している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を置く必要があるのが大変そうですね。まだここがボトルネックにはなっていない (つもり) ので回避している……。
面白さでいうと、命名をリントする話がなんだかんだで一番おもしろかったかもしれません。その発想はなかった、というのと、けっこう実用性を考えてlinterが実装されている、というののバランスがよかったです。
来年も参加します。朝は起きてコンディションを調整する必要があると思うので、また次回のオフライン会で……。
あと、三条の山ちゃんに何気に初めて入店した気がします。
*1:structのフィールドにポインタを含めない、time.Timeを使わない、など