predeclared は Go の事前宣言済み識別子(new、make、len、int など)をシャドーイングしている宣言を検出するツールです。
解決する問題
Go ではビルトイン関数や型の名前を変数名や関数名として再宣言できてしまいます。シャドーイングすると本来のビルトイン機能が使えなくなり、予期しないバグや混乱を引き起こします。
1 | // Before: ビルトインをシャドーイング |
1 | // After: 適切な変数名を使用 |
設定
1 | # .golangci.yml 設定例 |
オプション
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
ignore |
[]string |
[] |
チェック対象外にする事前宣言済み識別子のリスト |
qualified-name |
bool |
false |
メソッド名やフィールド名もチェック対象に含める |
事前宣言済み識別子の一覧
型
bool, byte, comparable, complex64, complex128, error, float32, float64, int, int8, int16, int32, int64, rune, string, uint, uint8, uint16, uint32, uint64, uintptr, any
関数
append, cap, clear, close, complex, copy, delete, imag, len, make, max, min, new, panic, print, println, real, recover
定数
true, false, iota
ゼロ値
nil
サンプル
検出例
1 | // predeclared が警告するパターン |
修正例
1 | func example1() { |
注意点
qualified-name: trueにするとメソッド名やフィールド名もチェック対象になる(例:type Foo struct { len int }が検出される)。厳しすぎる場合はfalseのままにするnewは Go のビルトインだが変数名として使われることが比較的多い。許容する場合はignoreに追加する- シャドーイングはコンパイルエラーにならないため、静的解析での検出が重要