切片(slice)
因爲數組的長度是不可變的 應用起來不夠靈活 所以衍生出來切片
切片的長度是可變的
切片聲明
var s = []int{}
創建一個長度爲0的切片
var s = []int{1,2,3}
創建一個 長度爲3的切片
var s = make([]int,10)
使用make創建一個長度爲10的切片
var s = make([]int,10,20)
使用make創建一個長度爲10的切片cap(容量)爲20的切片
cap(容量)
var s = make([]int,2,4)
fmt.Println("s的長度: ",len(s))
fmt.Println("s的容量: ",cap(s))
s的長度: 2
s的容量: 4
此時S的長度爲2,容量爲4。
var s = make([]int,2,4)
fmt.Println("s的長度: ",len(s))
fmt.Println("s的容量: ",cap(s))
s=append(s,3 )
fmt.Println(s)
fmt.Println("s的長度: ",len(s))
fmt.Println("s的容量: ",cap(s))
s=append(s,4 )
fmt.Println(s)
fmt.Println("s的長度: ",len(s))
fmt.Println("s的容量: ",cap(s))
s=append(s,5 )
fmt.Println(s)
fmt.Println("s的長度: ",len(s))
fmt.Println("s的容量: ",cap(s))
輸出爲:
s的長度: 2
s的容量: 4
[0 0 3]
s的長度: 3
s的容量: 4
[0 0 3 4]
s的長度: 4
s的容量: 4
[0 0 3 4 5]
s的長度: 5
s的容量: 8
-------------------------------------------------------------------------------------------------------------------------------------
當添加的元素時 超過S的容量
此時切片會自動擴容
擴容的方式爲 當前長度 X 2
再具體的可以看看源碼
注意事項
1.因爲切片底層的擴容是 把擴容前的數組 複製到 擴容後的數組
爲效率考慮 應該在一開始設定切片的容量(夠用的容量)
切片是引用傳遞
var s = make([]int,2,4)
s[0] = 1
s[1] = 2
fmt.Println(s)
s2:=s
s2[1]=100
fmt.Println(s)
輸出
[1 2]
[1 100]
當s2的元素值發生改變時 s的元素也發生了改變
可以看出 切片是引用傳遞
var s1 = []int{1,2,3,4,5,6}
s2 := s1[2:4]
fmt.Println("s1 = ",s1)
fmt.Println("s2 = ",s2)
s3:=s2[:4]
fmt.Println("s3 = ",s3)
輸出
s1 = [1 2 3 4 5 6]
s2 = [3 4]
s3 = [3 4 5 6]
切片的底層就是一個數組,切片賦值時引用傳遞
s2 的長度雖然爲2 在對S3賦值時 因爲底層數組的原因 所以S3 = 3,4,5,6
append方法
var s = []int{1,2,3,4,5,6}
s= append(s,2 )
s = append(s,3,4,5 )
s = append(s, s...)
append 方法可以爲切片添加元素
可以多個也可以當個
也可以是相同類型的切片
切片的遍歷
切片的遍歷和數組的遍歷是一樣的
for i:=0; i <len(s);i++{
fmt.Println(s[i])
}
for i,v := range s{
fmt.Println(i,v)
}
因爲切片是引用傳遞 在賦值是都指向的是一個地址 所以!!COPY()
var a = []int{1,2,3,4,5,6}
var b = make([]int,10,20)
//將 a的元素拷貝到b裏
copy(b,a)
fmt.Println("切片a的元素: ",a)
fmt.Println("切片b的元素: ",b)
fmt.Println("切片a的地址: ",&a[1])
fmt.Println("切片b的地址: ",&b[1])
輸出爲
切片a的元素: [1 2 3 4 5 6]
切片b的元素: [1 2 3 4 5 6 0 0 0 0]
切片a[1]的地址: 0xc00000c2d8
切片b[1]的地址: 0xc00010c008
可以看出 a,b元素的地址是不同的
元素的刪除
go語言中沒有對元素進行刪除的函數
但是可以利用 append()函數來實現元素刪除
var a = []int{1,2,3,4,5,6}
a = append(a[0:1],a[2:6]... )
fmt.Println(a)
輸出爲:[1 3 4 5 6]
刪除了第二個元素