1.切片聲明及創建
聲明一個切片int型的切片
var s []int
初始化一個長度爲len,容量爲cap的切片
s = make([]int,len,cap) cap可以省略,省略後cap等於len
也可以簡潔的初始化
s:=make([]int ,len,cap)
還可以指定值的創建切片
s:=[]int{1,2,3,4}
指定索引值式的創建
s:=[]int{3:5} 索引下標爲3的值爲5
2.切片的相關操作
數組是值類型,切片和數組不一樣,切片是引用類型,如果不想改變原來的切片進行操作,可以使用copy(新切片,原切片)複製一份。切片在底層是數組,包含三部分,ptr爲指向開始的元素,len爲切片的長度,cap爲切片的容量。s[1:4]會得到索引爲1,2,3的值,腳標是前包括,後不包括。切片可以向後擴展,不可以向前擴展,s[i]不可以超越len(s),向後擴展不可以超越底層數組cap(s)。
例子1:
func update(s []int,val int) {
s[0] = val
}
func main(){
var total = [...]int{0,1,2,3,4,5,6,7}
s1:=total[:]
fmt.Println("change before")
fmt.Println(s1)
update(s1,100)
fmt.Println("change after")
fmt.Println(s1)
}
以上會輸出
change before
[0 1 2 3 4 5 6 7]
change after
[100 1 2 3 4 5 6 7]
例子2:以下會輸出什麼?
func main(){
var total = [...]int{0,1,2,3,4,5,6,7}
var s1 []int
s1=total[2:6]
fmt.Printf("s1 len=%d,cap=%d\n",len(s1),cap(s1))
s2:=s1[2:5]
fmt.Printf("s2 len=%d,cap=%d\n",len(s2),cap(s2))
fmt.Println(total)
fmt.Println(s1)
fmt.Println(s2)
}
輸出以下內容
s1 len=4,cap=6
s2 len=3,cap=4
[0 1 2 3 4 5 6 7]
[2 3 4 5]
[4 5 6]
畫圖看一下
這個就涉及到切片的向後擴展, s2的末索引超過s1的末索引時而不會報錯。s1和s2都指向底層的total數組。