– Slice default
When slicing, you may omit the high or low bounds to use their defaults instead.
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) }
– Slice length and capacity
The length of a slice is the number of elements it contains. The capacity of a slice is the number of elements in the underlying array, counting from the first element in the slice.
func main(){ s := []int{2, 3, 5, 7, 11, 13} printSlice(s) s = s[:0] printSlice(s) s = s[:4] printSlice(s) s = s[2:] printSlice(s) } func printSlice(s []int){ fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s) }
$ go build hello.go && ./hello
len=6 cap=6 [2 3 5 7 11 13]
len=0 cap=6 []
len=4 cap=6 [2 3 5 7]
len=2 cap=4 [5 7]
Nil slices
– The zero value of a slice is nil.
func main(){ var s[]int fmt.Println(s, len(s), cap(s)) if s == nil { fmt.Println("nil!") } }
– Creating a slice with make
The make function allocate a zeroed array and returns a slice that refers to that array.
func main(){ a := make([]int, 5) printSlice("a", a) b := make([]int, 0, 5) printSlice("b", b) c := b[:2] printSlice("c", c) d := c[2:5] printSlice("d", d) } func printSlice(s string, x []int){ fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x) }
$ go build hello.go && ./hello
a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
– Slices of slices
Slices can contain any type, including other slices.
func main(){ board := [][]string { []string{"_","_","_"}, []string{"_","_","_"}, []string{"_","_","_"}, } board[0][0] = "X" board[2][2] = "0" board[1][2] = "X" board[1][0] = "0" board[0][2] = "X" for i := 0; i < len(board); i++ { fmt.Printf("%s\n", strings.Join(board[i], " ")) } }
$ go build hello.go && ./hello
X _ X
0 _ X
_ _ 0
– Appending to a slice
It is common to append new elements to a slice, and so Go provides a built-in append function.
func main(){ var s []int printSlice(s) s = append(s, 0) printSlice(s) s = append(s, 1) printSlice(s) s = append(s, 2, 3, 4) printSlice(s) } func printSlice(s []int){ fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s) }
### Range
When ranging over a slice, two values are returned for each iteration. The first is the index, and the second is a copy of the element at that index.
var pow = []int{1, 2, 4, 8, 16, 32, 64, 128} func main(){ for i, v := range pow { fmt.Printf("2**%d = %d\n", i, v) } }
$ go build hello.go && ./hello
2**0 = 1
2**1 = 2
2**2 = 4
2**3 = 8
2**4 = 16
2**5 = 32
2**6 = 64
2**7 = 128
– Range continued
You can skip the index or value by assigning to _.
func main(){ pow := make([]int, 10) for i := range pow { pow[i] = 1 << uint(i) // == 2**i } for _, value := range pow { fmt.Printf("%d\n", value) } }
なるほど、Sliceって連想配列のような使い方ができるのね。