十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問題一站解決
slice理解

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供安陸網(wǎng)站建設(shè)、安陸做網(wǎng)站、安陸網(wǎng)站設(shè)計(jì)、安陸網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、安陸企業(yè)網(wǎng)站模板建站服務(wù),十余年安陸做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
golang 的slice是一個(gè)指向底層的數(shù)組的指針結(jié)構(gòu)體。
slice 方法返回一個(gè)包含 stringObj 的指定部分的 String 對(duì)象。
slice 方法一直復(fù)制到 end 所指定的元素,但是不包括該元素。如果 start 為負(fù),將它作為 length + start處理,此處 length 為數(shù)組的長(zhǎng)度。如果 end 為負(fù),就將它作為 length + end 處理,此處 length 為數(shù)組的長(zhǎng)度。如果省略 end ,那么 slice 方法將一直復(fù)制到 arrayObj 的結(jié)尾。如果 end 出現(xiàn)在 start 之前,不復(fù)制任何元素到新數(shù)組中。
這個(gè)結(jié)構(gòu)體有三個(gè)屬性,1.指向數(shù)組指針,2.len: slice中元素的數(shù)量 3.cap:slice占用內(nèi)存數(shù)量。
只有深刻理解這三個(gè)屬性才能在使用slice中不至于犯錯(cuò)。
正確理解變量和共享
多個(gè)slice之間可以共享底層的數(shù)據(jù),并且引用的數(shù)組部分區(qū)間可能重疊
以上是golang 圣經(jīng)中的一句話。深刻理解這句話對(duì)于日程編程非常有意義。
什么時(shí)候共享數(shù)據(jù)會(huì)被其他變量修改
func f1() {
a1 := []int{1,2,3,4,5,6}
a2 := a1
a3 := a1[1:3]
a1[1] = 999
fmt.Println("a1=",a1,"a2=",a2,"a3=",a3)
}運(yùn)行結(jié)果
a1= [1 999 3 4 5 6] a2= [1 999 3 4 5 6] a3= [999 3] Process finished with exit code 0
我們清楚的看到了數(shù)據(jù)共享,此時(shí)修改了a1 ,兩位兩個(gè)變量都被修改
什么時(shí)候不會(huì)修改
func f2() {
a1 := []int{1,2,3,4,5,6}
a2 := a1
a3 := a1[1:3]
a2 = append(a2,888)
a1[1] = 999
fmt.Println("a1=",a1,"a2=",a2,"a3=",a3)
}運(yùn)行結(jié)果
a1= [1 999 3 4 5 6] a2= [1 2 3 4 5 6 888] a3= [999 3] Process finished with exit code 0
可以雖然a1被修改,a2并沒有修改。我們知道append函數(shù)會(huì)面臨內(nèi)存的重新分配。所以等a2進(jìn)行append的時(shí)候,會(huì)重新申請(qǐng)內(nèi)存空間,將原有數(shù)組拷貝然后增加如新值。也就是當(dāng)append操作的時(shí)候,此時(shí)a2 不在和a1 共享內(nèi)存了。
在對(duì)slice復(fù)制的時(shí)候,如果面臨多個(gè)變量同時(shí)指向一個(gè)數(shù)組的時(shí)候,一定要考慮到數(shù)據(jù)的共享和內(nèi)存的重新分配。
以上就是golang slice如何拷貝的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!