久々にポインタ関連でバグらせてしまったので、自戒のためにメモしておく。 tl;dr for range ループの value は常に同じアドレス値を取る。 バグらせた実装 あるスライスから特定の条件を満たす値だけを抽出した新しいスライスを作ろうをして以下のようなコードを書いた。 type User struct { id int } func filter(users []User) []*User{ var filtered []*User for _, v := range users { if v.id % 2 == 0{ filtered = append(filtered, &v) } } return users } このコードを実行したとき filtered のスライスはどのような値になるだろうか? 結果はこのようになる。 users := []User{{1}, {2},