在創(chuàng)建一個(gè)新的切片是都會(huì)先創(chuàng)建一個(gè)長(zhǎng)度為len的數(shù)組,并為其開(kāi)辟一個(gè)cap長(zhǎng)度為cap的額外空間,所以在cap范圍類(lèi)增加元素,數(shù)組的起始地址不會(huì)改變,否則會(huì)創(chuàng)建一個(gè)新的數(shù)組,即起始的位置發(fā)生改變
數(shù)組創(chuàng)建
代碼
intArr:=[...]int{1,2,3,4,5,6,7,9}
//方式一指定開(kāi)始和結(jié)束
s:=intArr[1:3]
//方式er指定開(kāi)始和結(jié)束+容量
s:=intArr[1:3:6]
創(chuàng)建后的slice
[a: b :c]
a:起始位置
b:截取數(shù)據(jù)的結(jié)束位置 默認(rèn)到末端)
c:截取后的容量位置 默認(rèn)到末端)
len為截取的元素長(zhǎng)度 即:(3 - 1=2)
cap為截取的起始元素到素組最后一個(gè)元素的長(zhǎng)度 即:
(原數(shù)組長(zhǎng)度:8 - 起始元素1=7)
底層數(shù)組: 為原數(shù)組的截取的起始元素到素組最后一個(gè)元素
![](/d/20211017/bfec8fec446720bc14847c546cbd8528.gif)
make創(chuàng)建
代碼
創(chuàng)建后的slice
len為:10
cap為:20(在創(chuàng)建時(shí)指定)
底層數(shù)組: 長(zhǎng)度為10的數(shù)組
slice擴(kuò)容
在cap范圍內(nèi)不會(huì)創(chuàng)建新的底層數(shù)組
超過(guò)cap則會(huì)創(chuàng)建新的數(shù)組 ,生成新的cap和len 超過(guò)cap也會(huì)的
補(bǔ)充:golang 中使用數(shù)組創(chuàng)建slice時(shí)的注意事項(xiàng)
golang中,slice是對(duì)固定長(zhǎng)度數(shù)組的一段切片,其底層是用對(duì)數(shù)值空間的指針實(shí)現(xiàn)的。
在golang中當(dāng)使用一個(gè)數(shù)組來(lái)創(chuàng)建slice時(shí)如:
var array [5]int = [5]int{1,2,3,4,5}
//切割出數(shù)組中的4個(gè)值,創(chuàng)建一個(gè)slice
myslice := array[0:4]
打印array的值為:
1, 2, 3, 4, 5
打印mysqlice的值為:
1, 2, 3, 4
現(xiàn)在我們對(duì)myslice進(jìn)行append操作
myslice = append(myslice,100)
打印array的值為:
1, 2, 3, 4, 100
打印mysqlice的值為:
1, 2, 3, 4, 100
現(xiàn)在我們?cè)賹?duì)myslice進(jìn)行修改操作
打印array的值為:
50, 2, 3, 4, 100
打印mysqlice的值為:
50, 2, 3, 4, 100
當(dāng)slice的長(zhǎng)度沒(méi)有超過(guò)創(chuàng)建是的數(shù)組的長(zhǎng)度時(shí),slice還是指向的創(chuàng)建時(shí)使用的數(shù)組。
但是!
現(xiàn)在myslice的長(zhǎng)度已經(jīng)和用來(lái)創(chuàng)建slice時(shí)使用的數(shù)組的長(zhǎng)度一致了
我們?cè)賹?duì)myslice進(jìn)行append操作,讓myslice的長(zhǎng)度大于創(chuàng)建時(shí)使用的數(shù)組的長(zhǎng)度
myslice = append(myslice,200)
打印array的值為:
50, 2, 3, 4, 100
打印mysqlice的值為:
50, 2, 3, 4, 100, 200
myslice不是通過(guò)指針的方式跟arr建立關(guān)聯(lián)的嗎?為毛這種情況卻沒(méi)有改變arr的值呢?
因?yàn)楫?dāng)myslice超出arr的長(zhǎng)度時(shí),Go語(yǔ)言會(huì)隱含式地對(duì)array做了copy,并讓myslice內(nèi)部的指針重新指向了新數(shù)值,所以一切預(yù)期中修改array的值的操作,都不會(huì)生效!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- Golang 拷貝Array或Slice的操作
- golang中的空slice案例
- Golang::slice和nil的對(duì)比分析
- golang語(yǔ)言如何將interface轉(zhuǎn)為int, string,slice,struct等類(lèi)型
- Golang中的Slice與數(shù)組及區(qū)別詳解
- golang中range在slice和map遍歷中的注意事項(xiàng)
- golang slice元素去重操作