golang-切片slice的創(chuàng)建方式
在創(chuàng)建一個新的切片是都會先創(chuàng)建一個長度為len的數(shù)組,并為其開辟一個cap長度為cap的額外空間,所以在cap范圍類增加元素,數(shù)組的起始地址不會改變,否則會創(chuàng)建一個新的數(shù)組,即起始的位置發(fā)生改變
數(shù)組創(chuàng)建
代碼
intArr:=[...]int{1,2,3,4,5,6,7,9}
//方式一指定開始和結(jié)束
s:=intArr[1:3]
//方式er指定開始和結(jié)束+容量
s:=intArr[1:3:6]
創(chuàng)建后的slice
[a: b :c]
a:起始位置
b:截取數(shù)據(jù)的結(jié)束位置 默認(rèn)到末端)
c:截取后的容量位置 默認(rèn)到末端)
len為截取的元素長度 即:(3 - 1=2)
cap為截取的起始元素到素組最后一個元素的長度 即:
(原數(shù)組長度:8 - 起始元素1=7)
底層數(shù)組: 為原數(shù)組的截取的起始元素到素組最后一個元素

make創(chuàng)建
代碼
s:=make([]int,10,20)
創(chuàng)建后的slice
len為:10
cap為:20(在創(chuàng)建時指定)
底層數(shù)組: 長度為10的數(shù)組
slice擴(kuò)容
在cap范圍內(nèi)不會創(chuàng)建新的底層數(shù)組
超過cap則會創(chuàng)建新的數(shù)組 ,生成新的cap和len 超過cap也會的
補(bǔ)充:golang 中使用數(shù)組創(chuàng)建slice時的注意事項
golang中,slice是對固定長度數(shù)組的一段切片,其底層是用對數(shù)值空間的指針實現(xiàn)的。
在golang中當(dāng)使用一個數(shù)組來創(chuàng)建slice時如:
var array [5]int = [5]int{1,2,3,4,5}
//切割出數(shù)組中的4個值,創(chuàng)建一個slice
myslice := array[0:4]
打印array的值為:
1, 2, 3, 4, 5
打印mysqlice的值為:
1, 2, 3, 4
現(xiàn)在我們對myslice進(jìn)行append操作
myslice = append(myslice,100)
打印array的值為:
1, 2, 3, 4, 100
打印mysqlice的值為:
1, 2, 3, 4, 100
現(xiàn)在我們再對myslice進(jìn)行修改操作
myslice[0] = 50
打印array的值為:
50, 2, 3, 4, 100
打印mysqlice的值為:
50, 2, 3, 4, 100
當(dāng)slice的長度沒有超過創(chuàng)建是的數(shù)組的長度時,slice還是指向的創(chuàng)建時使用的數(shù)組。
但是!
現(xiàn)在myslice的長度已經(jīng)和用來創(chuàng)建slice時使用的數(shù)組的長度一致了
我們再對myslice進(jìn)行append操作,讓myslice的長度大于創(chuàng)建時使用的數(shù)組的長度
myslice = append(myslice,200)
打印array的值為:
50, 2, 3, 4, 100
打印mysqlice的值為:
50, 2, 3, 4, 100, 200
myslice不是通過指針的方式跟arr建立關(guān)聯(lián)的嗎?為毛這種情況卻沒有改變arr的值呢?
因為當(dāng)myslice超出arr的長度時,Go語言會隱含式地對array做了copy,并讓myslice內(nèi)部的指針重新指向了新數(shù)值,所以一切預(yù)期中修改array的值的操作,都不會生效!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
golang int 轉(zhuǎn)float 強(qiáng)轉(zhuǎn)和高精度轉(zhuǎn)操作
這篇文章主要介紹了golang int 轉(zhuǎn)float 強(qiáng)轉(zhuǎn)和高精度轉(zhuǎn)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
go語言中基本數(shù)據(jù)類型及應(yīng)用快速了解
這篇文章主要為大家介紹了go語言中基本數(shù)據(jù)類型應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
go讀取request.Body內(nèi)容踩坑實戰(zhàn)記錄
很多初學(xué)者在使用Go語言進(jìn)行Web開發(fā)時,都會遇到讀取 request.Body內(nèi)容的問題,這篇文章主要給大家介紹了關(guān)于go讀取request.Body內(nèi)容踩坑實戰(zhàn)記錄的相關(guān)資料,需要的朋友可以參考下2023-11-11
利用systemd部署golang項目的實現(xiàn)方法
這篇文章主要介紹了利用systemd部署golang項目的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
goFrame的隊列g(shù)queue對比channel使用詳解
這篇文章主要為大家介紹了goFrame的gqueue對比channel使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Golang標(biāo)準(zhǔn)庫unsafe源碼解讀
這篇文章主要為大家介紹了Golang標(biāo)準(zhǔn)庫unsafe源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
golang并發(fā)工具M(jìn)apReduce降低服務(wù)響應(yīng)時間
這篇文章主要為大家介紹了golang并發(fā)使用MapReduce降低服務(wù)響應(yīng)時間實踐使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04

