状況
スライスをrangeして取り出した要素のポインタをとって処理していたときに、
出てきたものが全て同じ要素(1個目の要素)になってしまうという現象に遭遇しました。
それであれこれ試したところ、以下のような挙動になっていることを把握しました。
rangeで取得した要素のアドレスは全て同じものになっている
go
1a := []string{"a", "b"} 2fmt.Printf("slice : %#p\n", a) 3for i, item := range a { 4 fmt.Printf("range %d %#v\n", i, item) 5 fmt.Printf("range %d %#p\n", i, &item) 6} 7for i := 0; i < len(a); i++ { 8 fmt.Printf("index %d %#v\n", i, a[i]) 9 fmt.Printf("index %d %#p\n", i, &a[i]) 10} 11 12// slice : c0000045e0 13// range 0 "a" 14// range 0 c000046640 15// range 1 "b" 16// range 1 c000046640 //同じアドレス 17// index 0 "a" 18// index 0 c0000045e0 19// index 1 "b" 20// index 1 c0000045f0 //違うアドレス 21
質問
rangeとindex参照でこういう違いが出る理由が理解できません。
また、range参照で返っているアドレスは、 sliceそのものとも、index参照時のアドレスとも違うものになっており、一体なんなのかが分かりません。
以上について、どのような仕組みになっているのか教えていただけないでしょうか。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/25 05:03