いろいろ備忘録日記

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

Goメモ-280 (go vet にシャドウイング検知してくれるshadowを入れて使う)

概要

以下、自分用のメモです。そんなに使う場面は無いのですが、たまに使うときがあるので、ついでにここにメモメモ。。

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

今度は検出されました。

参考情報

yourbasic.org

Go言語による並行処理

Go言語による並行処理

Amazon


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

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