golangci-lint に叱られる
私は Go 言語コードを ATOM エディタおよび go-plus パッケージで書いているのだが,最近の go-plus は lint に以下のツールを選択できるようだ。
特に golangci-lint は gometalinter より5倍も速いと豪語してるので,こちらを試してみることにした。 GolangCI も気になるが,それはまたいつか。
いやぁ,最近の lint は賢いんだね。 特に古いコードのまま放置している部分についてどえら叱られたですよ。 ボーっと生きててすみません(笑)
error を無視すんな
例えば io
.Reader
から io
.Writer
へデータを流し込むのにやっつけコードで
io.Copy(writer, reader)
とか書くことがあるが golangci-lint にかけたら「返り値の error を無視すんなや」って叱られた。 ちゃんと書くなら
if _, err := io.Copy(writer, reader); err != nil {
...
}
とかすべき,ということだろう。 明示的に返り値の error を無視するなら
_, _ = io.Copy(writer, reader)
などと明示すれば,とりあえず叱られない。 まぁ安直にこう書いてしまうのは問題だけど。
true は不要
無限ループについて昔は何となく
for true {
...
}
とか書いていて,またも「true とか要らんけぇ」と叱られた。 正しくは
for {
...
}
でよい。 こういう「若気の至り」なコードがそこかしこに残ってて,黒歴史を見せられてるようでちょっと恥ずかしい。
SIGNAL のバッファリング
SIGNAL を channel として登録する際に誤って
ch := make(chan os.Signal)
signal.Notify(ch, sig...)
とか書いていて「ちゃんとバッファリングさせろや,ゴラァ」とまたまた叱られた。 正解は
ch := make(chan os.Signal, 1)
signal.Notify(ch, sig...)
そんなことまで知っている golangci-lint は偉いねぇ。
Lint は知見のかたまり
というわけで過去の恥ずかしいコードが次々と発覚してしまい,公開しているコードのリファクタリングを行っている真っ最中である。 色々やりたいことがあるのに横道に逸れてばっかり。
C 言語で書いてた頃は MISRA-C とかいった「事実上の標準」みたいなのがあって lint ツールとかも(少なくともエンタープライズ向けは)そういったものに準拠したものが色々あった。 Lint ってのはそのプログラミング言語に関する知見のかたまりなので上手に使いこなしていきたいものである。
ブックマーク
- Big Sky :: Lint ツールを Language Server に対応させるコマンド efm-langserver 作った。
- signal.Notifyを使うときは必ずバッファ付きチャネルで利用すること - My External Storage
参考図書
- プログラミング言語Go
- アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
- 丸善出版 2016-06-20 (Release 2021-07-13)
- Kindle版
- B099928SJD (ASIN)
- 評価
Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら。
- 組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド
- MISRA‐C研究会 (編集)
- 日本規格協会 2006-10-01
- 単行本
- 4542503461 (ASIN), 9784542503465 (EAN), 4542503461 (ISBN)
- 評価
私が持っているのはこれよりひとつ古い版だが,まぁいいか。むかし,車載用の組み込みエンジニアをやっていた頃は必読書として読まされました。今はもっと包括的な内容のものがあるはず。