golang-切片slice的創建方式
在創建一個新的切片是都會先創建一個長度為len的數組,並為其開辟一個cap長度為cap的額外空間,所以在cap范圍類增加元素,數組的起始地址不會改變,否則會創建一個新的數組,即起始的位置發生改變
數組創建
代碼
intArr:=[...]int{1,2,3,4,5,6,7,9} //方式一指定開始和結束 s:=intArr[1:3] //方式er指定開始和結束+容量 s:=intArr[1:3:6]
創建後的slice
[a: b :c]
a:起始位置
b:截取數據的結束位置 默認到末端)
c:截取後的容量位置 默認到末端)
len為截取的元素長度 即:(3 – 1=2)
cap為截取的起始元素到素組最後一個元素的長度 即:
(原數組長度:8 – 起始元素1=7)
底層數組: 為原數組的截取的起始元素到素組最後一個元素
make創建
代碼
s:=make([]int,10,20)
創建後的slice
len為:10
cap為:20(在創建時指定)
底層數組: 長度為10的數組
slice擴容
在cap范圍內不會創建新的底層數組
超過cap則會創建新的數組 ,生成新的cap和len 超過cap也會的
補充:golang 中使用數組創建slice時的註意事項
golang中,slice是對固定長度數組的一段切片,其底層是用對數值空間的指針實現的。
在golang中當使用一個數組來創建slice時如:
var array [5]int = [5]int{1,2,3,4,5} //切割出數組中的4個值,創建一個slice myslice := array[0:4]
打印array的值為:
1, 2, 3, 4, 5
打印mysqlice的值為:
1, 2, 3, 4
現在我們對myslice進行append操作
myslice = append(myslice,100)
打印array的值為:
1, 2, 3, 4, 100
打印mysqlice的值為:
1, 2, 3, 4, 100
現在我們再對myslice進行修改操作
myslice[0] = 50
打印array的值為:
50, 2, 3, 4, 100
打印mysqlice的值為:
50, 2, 3, 4, 100
當slice的長度沒有超過創建是的數組的長度時,slice還是指向的創建時使用的數組。
但是!
現在myslice的長度已經和用來創建slice時使用的數組的長度一致瞭
我們再對myslice進行append操作,讓myslice的長度大於創建時使用的數組的長度
myslice = append(myslice,200)
打印array的值為:
50, 2, 3, 4, 100
打印mysqlice的值為:
50, 2, 3, 4, 100, 200
myslice不是通過指針的方式跟arr建立關聯的嗎?為毛這種情況卻沒有改變arr的值呢?
因為當myslice超出arr的長度時,Go語言會隱含式地對array做瞭copy,並讓myslice內部的指針重新指向瞭新數值,所以一切預期中修改array的值的操作,都不會生效!
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。