概要
以下、よく忘れるので自分用のメモです。
Goで、特定の関数やメソッドなどを非推奨(Deprecated) にしたい場合は、関数ヘッダコメントの部分で Deprecated: xxxxx....
と記載すれば良いです。
で、staticcheckでは Deprecated な処理を使っている場合に警告を表示してくれます。
実際に試してみます。
試してみる
まず検証するためのアプリを用意。なんでもいいです。
今回、わざとDeprecatedにするために自分のライブラリを呼び出すようにしています。
$ go version go version go1.19 linux/amd64 $ mkdir app ; cd app $ go mod init app go: creating new go.mod: module app $ cat << EOF > main.go > package main > import ( > "fmt" > "github.com/devlights/gomy/iter" > ) > func main() { > for range iter.Range(3) { > fmt.Println("helloworld") > } > } > EOF $ go fmt main.go main.go $ cat main.go package main import ( "fmt" "github.com/devlights/gomy/iter" ) func main() { for range iter.Range(3) { fmt.Println("helloworld") } }
実行して動くこと確認
$ go mod tidy go: finding module for package github.com/devlights/gomy/iter go: found github.com/devlights/gomy/iter in github.com/devlights/gomy v0.5.2 $ go run main.go helloworld helloworld helloworld
まだ、Deprecatedしていないので、staticcheck かけても何も出ません。
$ staticcheck ./...
次は、利用しているライブラリの関数を Deprecated してみます。
今回は Go 1.18 で追加された Workspace モードを利用します。
$ cd .. $ git clone https://github.com/devlights/gomy Cloning into 'gomy'... remote: Enumerating objects: 1171, done. remote: Counting objects: 100% (21/21), done. remote: Compressing objects: 100% (20/20), done. remote: Total 1171 (delta 4), reused 4 (delta 1), pack-reused 1150 Receiving objects: 100% (1171/1171), 1.26 MiB | 11.15 MiB/s, done. Resolving deltas: 100% (673/673), done. $ ls -1 app gomy $ go work init app gomy $ ls -1 app go.work gomy $ cat go.work go 1.19 use ( ./app ./gomy )
んで、ライブラリ側のソースをちょいといじります。こんな感じに調整。
$ vim gomy/iter/range.go $ cd gomy $ git diff diff --git a/iter/range.go b/iter/range.go index 5ab57f3..3c4c78f 100644 --- a/iter/range.go +++ b/iter/range.go @@ -3,6 +3,8 @@ package iter // Range は、指定された回数分ループ可能な空スライスを生成して返します。 // // 元ネタは https://github.com/bradfitz/iter/blob/master/iter.go です。 +// +// Deprecated: Do not use this. func Range(n int) []struct{} { return make([]struct{}, n) }
アプリ側に戻って staticcheck してみます。
$ cd ../app $ staticcheck ./... main.go:9:12: iter.Range is deprecated: Do not use this. (SA1019)
ちゃんと警告がでましたね。
Workspaceからライブラリ側を削除すると、当然警告は出なくなります。
$ cd .. $ go work edit -dropuse gomy $ cat go.work go 1.19 use ./app $ cd app $ staticcheck ./...
参考情報
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。