unconvert は不要な型変換(既に同じ型である式への変換)を検出するツールです。
解決する問題
変数が既にその型を持っているにもかかわらず明示的に型変換を行うと、コードが冗長になり可読性が下がります。リファクタリングで型を変更した際に古い変換が残り続けることもあります。
1 2 3 4 5 6 7 8
| func CalcTotal(price int64, quantity int64) int64 { return int64(price) * int64(quantity) }
func FormatName(name string) string { return string(name) }
|
1 2 3 4 5 6 7 8
| func CalcTotal(price int64, quantity int64) int64 { return price * quantity }
func FormatName(name string) string { return name }
|
設定
公式ドキュメント
1 2 3 4 5 6 7 8 9 10
| version: "2"
linters: enable: - unconvert settings: unconvert: fast-math: false safe: false
|
オプション
| オプション |
型 |
デフォルト |
説明 |
fast-math |
bool |
false |
中間丸め処理を強制する変換も除去する |
safe |
bool |
false |
より保守的な解析を行う(実験的) |
サンプル
検出例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
func example() { var i int64 = 42 _ = int64(i)
var s string = "hello" _ = string(s)
var b []byte = []byte{1, 2, 3} _ = []byte(b) }
type MyInt int
func calc(v MyInt) MyInt { return MyInt(v) }
|
修正例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| func example() { var i int64 = 42 _ = i
var s string = "hello" _ = s
var b []byte = []byte{1, 2, 3} _ = b }
type MyInt int
func calc(v MyInt) MyInt { return v }
|
注意点
- クロスプラットフォームで型が異なる場合がある(例:
syscall パッケージのフィールド)。スタンドアロン版では -all フラグで全 GOOS/GOARCH の組み合わせを検証できる
fast-math: true は浮動小数点の中間丸め処理に影響する変換も除去するため、精度が重要な計算では注意が必要
- リファクタリング後に残った不要な変換を一括で見つけるのに特に効果的
参考リンク