– 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って連想配列のような使い方ができるのね。