Goにおける変数シャドーイングについて、それがどうして問題か、そしてその対策について書いていきます。
先に結論から言いますと、対策としてGo標準のリンターであるvetとshadowを使うことです。
もうやっている方は読む必要がないですが、知らない人がいましたら、多くの方が陥ってしまうことなので、是非最後まで読んでもらえたらと思います。
シャドーイングとは?
変数シャドーイングとは、ある変数を宣言した後に、一つ下のスコープでも同じ変数名が宣言できてしまうことを言います。
例として以下があります。
package main
import "fmt"
func main() {
num := 5
if num > 0 {
num := 8
fmt.Println("内側のスコープ:", num)
}
fmt.Println("外側のスコープ", num)
}
こちらを実行すると結果が、内側の結果が「8」、外側のスコープが「5」になってしまいます。
% go run main.go
内側のスコープ: 8
外側のスコープ 5
変数シャドーイングにより、プログラムが意図しない動きをしてエラーが発生してしまう可能性があるので、書く時にはとても注意が必要です。
対策
対策方法として、Go標準のリンターであるvetとshadowを使うことです。
shadowをgo installする。
go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow@latest
以下のようにコマンドを使って静的解析して、変数シャドーイングがしているソースファイルとその行数を表示してくれます。その箇所のソースを修正して、結果が表示されないようにします。
% go vet -vettool=$(which shadow)
# test/shadow
./main.go:8:3: declaration of "num" shadows declaration at line 6
まとめ
今回は変数シャドーイングの問題と対策について説明をしてきました。
これによりコードにエラーが起きないようにできますが、他にも安全にシステムを稼働させるにはGoの脆弱性も気にする必要があります、脆弱性を確認する方法の記事も書いてますので、興味がありましたら、そちらも読んでもらえたらと思います。
【おすすめ記事のリンク】
コメント