コンパイル通るけど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]
}
そもそも、こういうことがやりたかったのでコード間違ってたんですけどね。
事例その2 ループ内部完結
=
と:=
を間違える、よくやるやつ。
dev := "hoge"
for _, v := range []string{"a", "b"} {
dev := v
fmt.Println(dev) // <- "a","b"
}
fmt.Println(dev) // <- "hoge"