Skip to content

型アサーション直後の参照ミスを検出するLinterが欲しい

Goサブ会の話題。以下のような型アサーションにおけるミスを検出したい。

func exampleCast(x any) {
x2, ok := x.(SomeType)
if !ok {
// ここで x ではなく x2 を参照してしまっている
log.Printf("x is not SomeType (got %T)\n", x2)
return
}
}
func exampleVar(x any) {
x2, ok := x.(SomeType)
if !ok {
log.Printf("x is not SomeType (got %T)\n", x)
// ここでreturnとかcontinueとかするべきだけど忘れていて、型キャスト失敗したx2が後続のコードで参照されている
}
log.Printf("x2 = %v\n", x2)
}

いくつかLinterを見繕ったけど、該当するものはなかった。

uber-go/nilawayが最も近いと思うが、Not catching possible type assertion exceptions?というイシューがあるだけで、上記のミスを検出できなかった。