unconvert

Table of Contents

  1. 解決する問題
  2. 設定
  3. オプション
  4. サンプル
    1. 検出例
    2. 修正例
  5. 注意点
  6. 参考リンク

unconvert は不要な型変換(既に同じ型である式への変換)を検出するツールです。

解決する問題

変数が既にその型を持っているにもかかわらず明示的に型変換を行うと、コードが冗長になり可読性が下がります。リファクタリングで型を変更した際に古い変換が残り続けることもあります。

1
2
3
4
5
6
7
8
// Before: 不要な型変換
func CalcTotal(price int64, quantity int64) int64 {
return int64(price) * int64(quantity) // price, quantity は既に int64
}

func FormatName(name string) string {
return string(name) // name は既に string
}
1
2
3
4
5
6
7
8
// After: 不要な変換を除去
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
# .golangci.yml 設定例
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
// unconvert が警告するパターン

func example() {
var i int64 = 42
_ = int64(i) // unnecessary conversion

var s string = "hello"
_ = string(s) // unnecessary conversion

var b []byte = []byte{1, 2, 3}
_ = []byte(b) // unnecessary conversion
}

type MyInt int

func calc(v MyInt) MyInt {
return MyInt(v) // unnecessary conversion
}

修正例

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 は浮動小数点の中間丸め処理に影響する変換も除去するため、精度が重要な計算では注意が必要
  • リファクタリング後に残った不要な変換を一括で見つけるのに特に効果的

参考リンク