goでdeprecatedな関数の利用に対してwarningを出すlintの使い方のメモ

github.com

適切に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の結果

staticcheckなどでチェックができる

$ 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を含んでいるので、何の気なしに利用していててもデフォルトで有効になっていそう。

github.com github.com

gist

参考


  1. 正確には、関数には限らないが

  2. こういう細々とした作成者側の設ける決まりごとがけっこうgoには多い気がする