slice是一個(gè)序列的值悯森,可以根據(jù)序列號(hào)來(lái)訪問(wèn)⌒髂欤可以使用 len(s) 返回 slice s 的長(zhǎng)度瓢姻。
寫(xiě)一個(gè)例子,利用 for 循環(huán)音诈,打印出 slice 的每一個(gè)值幻碱。利用下標(biāo)來(lái)訪問(wèn)每一個(gè)值绎狭。
package main
import (
"fmt"
)
func main() {
s := []int{1,1,2,3,5,8,13,21,34}
fmt.Println("slice s is", s)
for i := 0; i < len(s); i++ {
fmt.Printf("s[%d] == %d\n", i, s[i])
}
}
運(yùn)行結(jié)果
slice s is [1 1 2 3 5 8 13 21 34]
s[0] == 1
s[1] == 1
s[2] == 2
s[3] == 3
s[4] == 5
s[5] == 8
s[6] == 13
s[7] == 21
s[8] == 34
slice的構(gòu)成元素可以是任何類型,甚至也可以是其他slice褥傍。
比如:
game := [][]string{
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
}
slice game的元素類型是 []string 的slice儡嘶。
請(qǐng)看完整代碼
package main
import (
"fmt"
"strings"
)
func main() {
//填字游戲
game := [][]string{
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
[]string{"_","_","_"},
}
//玩家填寫(xiě)的內(nèi)容
game[0][0] = "X"
game[0][1] = "X"
game[0][2] = "X"
game[1][0] = "Y"
game[1][1] = "Y"
game[1][2] = "Y"
game[2][0] = "Z"
game[2][1] = "Z"
game[2][2] = "Z"
printGame(game)
}
func printGame(game [][]string) {
for i := 0; i < len(game); i++ {
fmt.Printf("%s\n", strings.Join(game[i], " "))
}
}
運(yùn)行看看結(jié)果
X X X
Y Y Y
Z Z Z
_ _ _
_ _ _
任何一個(gè)slice都是對(duì)數(shù)組的一個(gè)切片后的使用。而且摔桦,它不影響原數(shù)組的值社付。
slice也可以重新切片。
像這樣
package main
import (
"fmt"
)
func main() {
s := []int{1,1,2,3,5,8,13,21,34,55}
fmt.Println("s ==", s)
fmt.Println("s[1:4] ==", s[1:4])
fmt.Println("s[2:5] ==", s[2:5])
//省略的寫(xiě)法邻耕, : 符號(hào)左邊省略,表示從0開(kāi)始
fmt.Println("s[:3] ==", s[:3])
//省略的寫(xiě)法燕鸽, : 符號(hào)右邊省略兄世,表示到最后一個(gè)元素
fmt.Println("s[4:] ==", s[4:])
}
重新切片的切面,注意省略的寫(xiě)法啊研。
s == [1 1 2 3 5 8 13 21 34 55]
s[1:4] == [1 2 3]
s[2:5] == [2 3 5]
s[:3] == [1 1 2]
s[4:] == [5 8 13 21 34 55]
可以看到御滩,此例中的多個(gè)slice都是針對(duì)同一個(gè)數(shù)組在操作。切片的切片的表達(dá)式是 s[lo:hi] 党远。
我們可以看到削解,hi 是不包含在新的slice內(nèi)的。
所以沟娱,s[lo:lo] 是空的氛驮,而 s[lo:lo + 1] 有一個(gè)元素。
使用 make 創(chuàng)建 slice 的時(shí)候济似,可以使用第三個(gè)參數(shù)矫废,指定容量。
容量用 cap() 表示砰蠢。
b := make([]int, 0, 5) //創(chuàng)建一個(gè)slice蓖扑,長(zhǎng)度為0,容量為5
b = b[:cap(b)] //b的長(zhǎng)度為5台舱,容量為5
b = b[1:] //b的長(zhǎng)度為4律杠,容量為4
用一個(gè)列子,看一下slice容量的變化竞惋。
package main
import (
"fmt"
)
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)
}
運(yùn)行結(jié)果
a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0]
d len=3 cap=3 [0 0 0]
新聲明的 slice 如果沒(méi)有賦值的話柜去,它的零值是 nil 。長(zhǎng)度和容量都是 0 碰声。
以下代碼可證
package main
import (
"fmt"
)
func main() {
var z []int
fmt.Println(z, len(z), cap(z))
if z == nil {
fmt.Println("nil !")
}
}
運(yùn)行結(jié)果
[] 0 0
nil !