Goの変数シャドーイング対策について

Go言語

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の脆弱性も気にする必要があります、脆弱性を確認する方法の記事も書いてますので、興味がありましたら、そちらも読んでもらえたらと思います。

【おすすめ記事のリンク】

コメント

タイトルとURLをコピーしました