Edited at

Goのスコープに苦しんだ事例集

コンパイル通るけどtestで死ぬ事例、個人的No.1のスコープ関連についてまとめ。


事例その1 メソッド完結

メソッド内でスコープ切れちゃうので、メソッド内でnewしてもダメだぜの例。

"スコープが切れる"という表現でいいのだろうか。。。

type hogehoge map[string]string

func (h hogehoge) Seter(p string) {
h["key"] = p
}
func (h *hogehoge) NewSeter(p string) {
h = &hogehoge{"p": p}
}

func main() {
f := hogehoge{}
f.Seter("ddd")
fmt.Println(f) // <- map[key:ddd]

f.NewSeter("sss")
fmt.Println(f) // <- map[key:ddd]
}

https://play.golang.org/p/mCEUyNGLgsy

そもそも、こういうことがやりたかったのでコード間違ってたんですけどね。


事例その2 ループ内部完結

=:=を間違える、よくやるやつ。

dev := "hoge"

for _, v := range []string{"a", "b"} {
dev := v
fmt.Println(dev) // <- "a","b"
}
fmt.Println(dev) // <- "hoge"

https://play.golang.org/p/ilj019ANt_f