goでdeprecatedな関数の利用に対してwarningを出すlintの使い方のメモ
適切にDeprecated:
という修飾を含んだコメントを追加すると、その関数を利用した際に、以下の様なwarning messageが出るようになる1。
main.go:8:2: greeting.Hello is deprecated: use HelloWithContext() (SA1019)
これの使い方のメモ。
Deprecated:
の使い方
特定の関数をdeprecated扱いにしたい場合には、先頭にDeprecated:
を付加したコメントを用意する(実際のコードでの利用例)。
例えば以下の様な感じ。Hello()
はdeprecatedで代わりにHelloWithContext()
を使ってほしい場合のコード。
greeting/hello.go
package greeting import ( "context" "fmt" ) // Hello ... // // Deprecated: use HelloWithContext() func Hello() { fmt.Println("greeting") } // HelloWithContext ... func HelloWithContext(ctx context.Context) { }
main.go
package main import ( "m/greeting" ) func main() { greeting.Hello() }
lintの結果
$ golint ./... $ staticcheck ./... main.go:8:2: greeting.Hello is deprecated: use HelloWithContext() (SA1019)
注意点
たまにこういう形でdeprecatedだけが書かれている例が見かける。
// Deprecated: xxx func Hello() {
これとgolintのコメントが必須というエラーに対応するために、以下のように書こうとする人が現れるが、これは上手く動かない。冒頭のリンク先の文章を読むと段落を追加すると言っているし想定した記述の仕方ではなさそう(マーカーとして使いたいというissueは登録されているが放置されているし、動かないと諦めるのが精神衛生上良さそう2)
// Deprecated: Hello ... func Hello() {
考えてみれば、deprecation warningなので、何らかの警告の理由が書きたくなるわけだし。横着のためのマーカーとしては機能しないと捉えてしまえば納得できなくはない。
$ golint ./... greeting/hello.go:8:1: comment on exported function Hello should be of the form "Hello ..." $ staticcheck ./... main.go:8:2: greeting.Hello is deprecated: Hello ... (SA1019) Run 'staticcheck -explain <check>' or visit https://staticcheck.io/docs/checks for documentation on checks.
以下の表現は意味がわからないし(関数の説明のためのコメントがdeprecation warning用のメッセージとして扱われている)。
greeting.Hello is deprecated: Hello ... (SA1019)
余談
余談だけど、staticcheckは、githubの提供しているsuper-linterが、golangci-lintを利用していて、このgolangci-lintはdefaultのlinterとしてstaticlintを含んでいるので、何の気なしに利用していててもデフォルトで有効になっていそう。