Go言語豆知識(一)
豆知識
Go言語には、スライスという概念があります。スライスは値型ではなく、参照型のデータです。スライスは値型のArrayを参照しています。
スライスを拡張するにはappendメソッドを使います。もしスライスを拡張するときに、元に参照するArrayの長さを超えた場合は、新しい参照元Arrayを再作りすることになります。
コード
slice1 := []int{1,2,3,4}
slice2 := slice1[:3]
fmt.Println("最初の段階、slice1,slice2はおなじ参照元Arrayを参照しています")
fmt.Println(slice1)
fmt.Println(slice2)
fmt.Println(&slice1[0])
fmt.Println(&slice2[0])
fmt.Println()
fmt.Println("slice2の長さはまた参照元Arrayの長さを超えていない")
slice2 = append(slice2, 15)
fmt.Println(slice1)
fmt.Println(slice2)
fmt.Println(&slice1[0])
fmt.Println(&slice2[0])
fmt.Println()
fmt.Print("slice2は元のArrayの長さを超えました。")
slice2 = append(slice2, 16)
fmt.Println(slice1)
fmt.Println(slice2)
fmt.Println(&slice1[0])
fmt.Println(&slice2[0])
最初の段階、slice1,slice2はおなじ参照元Arrayを参照しています
[1 2 3 4]
[1 2 3]
0xc0000b4000 <-参照元のアドレス(Array)
0xc0000b4000 <-参照元のアドレス(Array)
slice2の長さはまた参照元Arrayの長さを超えていない
[1 2 3 15]
[1 2 3 15]
0xc0000b4000 <-参照元のアドレス(Array)
0xc0000b4000 <-参照元のアドレス(Array)
slice2は元のArrayの長さを超えました。[1 2 3 15]
[1 2 3 15 16]
0xc0000b4000 <-参照元のアドレスA(Array)
0xc0000b8000 <-参照元のアドレス(新しいArray)
出力のように、最初slice1とslice2はおなじ参照元長さが4のArrayに参照しています。
slice1はArrayの0-3番目まで切り出しています。
slice2はArrayの0-2番目まで切り出しています。
1回目のappend作業をしてら、slice2の長さは3から4までに伸ばしました。そのときに参照元Arrayの長さは4です。slice2の拡張によって、参照元Arrayの4番目値が修正されました。
2回目のappend作業をしてら、slice2の長さは4から5までに伸ばしました。そのときに参照元Arrayの長さは4です。
もともとの参照元Array(長さ4)はslice2(長さ5)を納めないから、slice2の参照を収めるために、新しい参照元を作ることになります。
そのときに、slice1の参照元とslice2の参照元はそれぞれ異なる参照元になります。
0xc0000b4000 <-参照元のアドレスA(Array)
0xc0000b8000 <-参照元のアドレス(新しいArray)
説明
まとめ
スライスは参照しているArrayの長さを超えたら、新しい参照元を作成することになります。
Author And Source
この問題について(Go言語豆知識(一)), 我々は、より多くの情報をここで見つけました https://qiita.com/xu1718191411/items/d23197530d0253c63475著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .