go tourでわからなかったことのメモです
package main import "fmt" func main() { s := []int{2, 3, 5, 7, 11, 13} s = s[1:4] fmt.Println(s) s = s[:2] fmt.Println(s) s = s[1:] fmt.Println(s) }
結果は
[3 5 7] [3 5] [5]
でした おお・・・なるほど切り取ってくれて便利だね。と思っていました
試しに改変してみたら想定外の結果になりました
package main import "fmt" func main() { s := []int{1,2, 3, 4,5,6,7,8,9,10} s = s[0:8] fmt.Println(s) s = s[:2] fmt.Println(s) s = s[:4] fmt.Println(s) }
Result
[1 2 3 4 5 6 7 8] [1 2] [1 2 3 4]
最後はエラーになるかな・・・と思っていたら想定外の結果が返ってきたので調べてみた
- 最初の
s = s[0:8]
で、元のs
のインデックス0から7までの要素{1, 2, 3, 4, 5, 6, 7, 8}
を持つ新しいスライスが生成され、s
がこれに置き換わります。 - 次に
s = s[:2]
で、s
はインデックス0から1までの要素{1, 2}
を持つスライスになります。 - 最後に
s = s[:4]
を実行すると、s
は現在のスライス{1, 2}
の先頭から4つの要素を含むスライスに再定義されます。ただし、元のスライスの要素数を超えてインデックス4までの要素を取ろうとしているため、Go言語では元のスライスの長さに応じて自動的に調整されます。
まじか・・・エラーになった方が楽なんだけど