exptostd

Table of Contents

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

exptostd は golang.org/x/exp の実験的パッケージのうち、標準ライブラリに昇格済みの関数の使用を検出するツールです。

解決する問題

Go の進化に伴い、golang.org/x/exp/slicesgolang.org/x/exp/maps などの実験的パッケージの多くが Go 1.21 以降で標準ライブラリに取り込まれました。古い実験的パッケージを使い続けると、不要な外部依存が残り、最新の最適化やバグ修正を受けられません。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Before: 実験的パッケージを使用
import (
"golang.org/x/exp/maps"
"golang.org/x/exp/slices"
)

func example() {
m := map[string]int{"a": 1, "b": 2}
keys := maps.Keys(m)
clone := maps.Clone(m)

s := []int{3, 1, 2}
slices.Sort(s)
idx := slices.Index(s, 2)
_ = keys
_ = clone
_ = idx
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// After: 標準ライブラリに置き換え
import (
"maps"
"slices"
)

func example() {
m := map[string]int{"a": 1, "b": 2}
keys := slices.Collect(maps.Keys(m))
clone := maps.Clone(m)

s := []int{3, 1, 2}
slices.Sort(s)
idx := slices.Index(s, 2)
_ = keys
_ = clone
_ = idx
}

設定

公式ドキュメント

設定オプションはありません。有効化するだけで動作します。

1
2
3
4
5
6
# .golangci.yml
version: "2"

linters:
enable:
- exptostd

オプション

golangci-lint 経由では設定オプションはありません。

対象パッケージ

実験的パッケージ 標準ライブラリ 対象関数(一部)
golang.org/x/exp/maps maps Clone, Copy, DeleteFunc, Keys, Values, Equal, EqualFunc
golang.org/x/exp/slices slices Sort, SortFunc, Index, Contains, Clone, Compact, Reverse, BinarySearch など多数
golang.org/x/exp/constraints cmp Ordered

サンプル

検出例

1
2
3
4
5
6
7
8
9
10
11
import "golang.org/x/exp/slices"

// exptostd が警告: slices.Contains can be replaced by slices.Contains from the standard library
func HasAdmin(roles []string) bool {
return slices.Contains(roles, "admin")
}

// exptostd が警告: slices.Sort can be replaced by slices.Sort from the standard library
func SortIDs(ids []int) {
slices.Sort(ids)
}

修正例

1
2
3
4
5
6
7
8
9
import "slices"

func HasAdmin(roles []string) bool {
return slices.Contains(roles, "admin")
}

func SortIDs(ids []int) {
slices.Sort(ids)
}

注意点

  • Go 1.21 以上が必要。それ以前のバージョンをサポートする場合は golang.org/x/exp のままにする
  • maps.Keys は標準ライブラリではイテレータを返すため、API が完全に同一でない場合がある。置き換え時にシグネチャの変更に注意
  • go mod tidygolang.org/x/exp の依存が完全に除去されたことを確認する

参考リンク