スライスは配列に似ているが、要素を追加することによって大きさ(長さ)を変更できるデータ構造。大きさの変更は自動的になされる。小さくすることはできない。たぶん。
スライスの宣言は次のように大きさを指定せずに行う。
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]