スライスは配列に似ているが、要素を追加することによって大きさ(長さ)を変更できるデータ構造。大きさの変更は自動的になされる。小さくすることはできない。たぶん。
スライスの宣言は次のように大きさを指定せずに行う。
var 変数名 []型
同時に初期化するには:
var 変数名 []型 = []型{ 値1, 値2, 値3, ... } var 変数名 = []型{ 値1, 値2, 値3, ... }
大きさを指定しないことを除けば、配列と一緒だな。ちょっと試してみよう。
package main import "fmt" func main() { var s1 []int var s2 []int = []int{ 1,2,3,4,5 } var s3 = []int{ 6,7,8,9,10 } fmt.Println(s1) fmt.Println(s2) fmt.Println(s3) }
^o^ > go run slice.go [] [1 2 3 4 5] [6 7 8 9 10]
スライスはまた、配列の部分列を取り出すことでも作れる。
操作 | 意味 |
s[m:n] | m から n – 1 まで |
s[m:] | m から最後尾まで |
s[:n] | 先頭から n – 1 まで |
s[:] | 先頭から最後尾まで |
package main import "fmt" func main() { var array = [8]int{ 1,2,3,4,5,6,7,8 } var s1 = array[2:6] var s2 = array[3:] var s3 = array[:3] var s4 = array[:] fmt.Println(s1) fmt.Println(s2) fmt.Println(s3) fmt.Println(s4) }
^o^ > go run slice2.go [3 4 5 6] [4 5 6 7 8] [1 2 3] [1 2 3 4 5 6 7 8]
スライスを配列の部分列として取り出した場合、元の配列とデータ格納領域を共有することに注意。つまり、スライスの要素を変更すると、元の配列の対応する要素も変更される。
package main import "fmt" func main() { var array = [4]int{ 1,2,3,4 } fmt.Println(array) var s = array[:] s[2] = 10 fmt.Println(s) fmt.Println(array) }
^o^ > go run slice3.go [1 2 3 4] [1 2 10 4] [1 2 10 4]