概要
以下、自分用のメモです。そんなに使う場面は無いのですが、たまに使うときがあるので、ついでにここにメモメモ。。
Goでたまに出るバグの一つにシャドウイングがあります。
こんなのです。
package main import "fmt" func main() { i := 0 if alwaysTrue() { i := 1 fmt.Println(i) } fmt.Println(i) } func alwaysTrue() bool { return true }
上を実行すると以下のようになります。
$ go version go version go1.19.3 linux/amd64 $ go run main.go 1 0
ありゃ?ってなるやつですね。
これ、普通に go vet した場合は警告が出力されません。
$ go vet main.go
シャドウイングをgo vetでチェックしたい場合は shadow というコマンドを追加でインストールして実行します。
$ go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow@latest
インストールしたら、 go vet に -vettool
というオプションを付与して実行します。
$ go vet -vettool=$(command -v shadow) # app ./main.go:8:3: declaration of "i" shadows declaration at line 6
今度は検出されました。
参考情報
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。