masalibの日記

システム開発、運用と猫の写真ブログです

golang の入門 Slice defaultsについて

go tourでわからなかったことのメモです

go-tour-jp.appspot.com

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]

最後はエラーになるかな・・・と思っていたら想定外の結果が返ってきたので調べてみた

  1. 最初の s = s[0:8] で、元の s のインデックス0から7までの要素 {1, 2, 3, 4, 5, 6, 7, 8} を持つ新しいスライスが生成され、s がこれに置き換わります。
  2. 次に s = s[:2] で、s はインデックス0から1までの要素 {1, 2} を持つスライスになります。
  3. 最後に s = s[:4] を実行すると、s は現在のスライス {1, 2} の先頭から4つの要素を含むスライスに再定義されます。ただし、元のスライスの要素数を超えてインデックス4までの要素を取ろうとしているため、Go言語では元のスライスの長さに応じて自動的に調整されます。

まじか・・・エラーになった方が楽なんだけど