いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-244 (GoでDeprecatedの表し方)

概要

以下、よく忘れるので自分用のメモです。

Goで、特定の関数やメソッドなどを非推奨(Deprecated) にしたい場合は、関数ヘッダコメントの部分で Deprecated: xxxxx.... と記載すれば良いです。

stackoverflow.com

で、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 ./...

参考情報

go.dev

future-architect.github.io

devlights.hatenablog.com

Go言語による並行処理

Go言語による並行処理

Amazon


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。