在項(xiàng)目開(kāi)發(fā)過(guò)程中,更多的場(chǎng)景是需要一個(gè)長(zhǎng)度可以動(dòng)態(tài)更新的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),切片本身并非是動(dòng)態(tài)數(shù)組或數(shù)組指針,他內(nèi)部通過(guò)指針引用底層數(shù)組,并設(shè)定相關(guān)屬性將數(shù)據(jù)讀寫操作限定在指定區(qū)域內(nèi)。比如:
為金川等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及金川網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、金川網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!/runtime/slice.go type slice struct { array unsafe.Pointer len int cap int }
切片初始化
切片有兩種基本初始化方式:
切片可以通過(guò)內(nèi)置的make函數(shù)來(lái)初始化,初始化時(shí)len=cap,一般使用時(shí)省略cap參數(shù),默認(rèn)和len參數(shù)相同,在追加元素時(shí),如果容量cap不足時(shí),將按len的2倍動(dòng)態(tài)擴(kuò)容。
通過(guò)數(shù)組來(lái)初始化切片,以開(kāi)始和結(jié)束索引位置來(lái)確定最終所引用的數(shù)組片段。
//make([]T, len, cap) //T是切片的數(shù)據(jù)的類型,len表示length,cap表示capacity { s := make([]int,5) //len: 5 cap: 5 s := make([]int,5,10) //len: 5 cap: 10 s := []int{1,2,3} } { arr := [...]int{0,1,2,3,4,5,6,7,8,9} s1 := arr[:] s2 := arr[2:5] s3 := arr[2:5:7] s4 := arr[4:] s5 := arr[:4] s6 := arr[:4:6] fmt.Println("s1: ",s1, len(s1),cap(s1)) fmt.Println("s2: ",s2, len(s2),cap(s2)) fmt.Println("s3: ",s3, len(s3),cap(s3)) fmt.Println("s4: ",s4, len(s4),cap(s4)) fmt.Println("s5: ",s5, len(s5),cap(s5)) fmt.Println("s6: ",s6, len(s6),cap(s6)) } 輸出: s1: [0 1 2 3 4 5 6 7 8 9] 10 10 s2: [2 3 4] 3 8 s3: [2 3 4] 3 5 s4: [4 5 6 7 8 9] 6 6 s5: [0 1 2 3] 4 10 s6: [0 1 2 3] 4 6
通過(guò)上例說(shuō)明cap 是表示切片所引用數(shù)組片段的真實(shí)長(zhǎng)度,len是表示已經(jīng)賦過(guò)值的大下標(biāo)(索引)值加1.
注意下面兩種初始化方式的區(qū)別:
{ var a []int b := []int{} fmt.Println(a==nil,b==nil) fmt.Printf("a: %#v\n", (*reflect.SliceHeader)(unsafe.Pointer(&a))) fmt.Printf("b: %#v\n", (*reflect.SliceHeader)(unsafe.Pointer(&b))) fmt.Printf("a size %d\n", unsafe.Sizeof(a)) fmt.Printf("b size %d\n", unsafe.Sizeof(b)) } 輸出: true false a: &reflect.SliceHeader{Data:0x0, Len:0, Cap:0} b: &reflect.SliceHeader{Data:0x5168b0, Len:0, Cap:0} a size 24 b size 24 說(shuō)明: 1. 變量b的內(nèi)部指針被賦值,即使該指針指向了runtime.zerobase,但它依然完成了初始化操作 2. 變量a表示一個(gè)未初始化的切片對(duì)象,切片本身依然會(huì)分配所需的內(nèi)存
切片之間不支持邏輯運(yùn)算符,僅能判斷是否為nil,比如:
{ var a []int b := []int{} fmt.Println(a==b) //invalid operation: a == b (slice can only be compared to nil) }
reslice
在原slice的基礎(chǔ)上進(jìn)行新建slice,新建的slice依舊指向原底層數(shù)組,新創(chuàng)建的slice不能超出原slice
的容量,但是不受其長(zhǎng)度限制,并且如果修改新建slice的值,對(duì)所有關(guān)聯(lián)的切片都有影響,比如:
{ s := []string{"a","b","c","d","e","f","g"} s1 := s[1:3] //b,c fmt.Println(s1, len(s1),cap(s1)) s1_1 := s1[2:5] //c,d,e fmt.Println(s1_1, len(s1_1),cap(s1_1)) } 輸出: [b c] 2 6 [d e f] 3 4
append
向切片尾部追加數(shù)據(jù),返回新的切片對(duì)象; 數(shù)據(jù)被追加到原底層數(shù)組,如果超出cap限制,則為新切片對(duì)象重新分配數(shù)組,新分配的數(shù)組cap是原數(shù)組cap的2倍,比如:
{ s := make([]int,0,5) s = append(s , 1) s = append(s , 2,3,4,5) fmt.Printf("%p, %v, %d\n", s,s, cap(s)) s = append(s , 6) //重新分配內(nèi)存 fmt.Printf("%p, %v, %d\n", s, s, cap(s)) } 輸出: 0xc420010210, [1 2 3 4 5], 5 0xc4200140a0, [1 2 3 4 5 6], 10
如果是向nil切片追加數(shù)據(jù),則會(huì)高頻率的重新分配內(nèi)存和數(shù)據(jù)復(fù)制,比如:
{ var s []int fmt.Printf("%p, %v, %d\n", s,s, cap(s)) for i:= 0; i < 10;i++{ s = append(s, i) fmt.Printf("%p, %v, %d\n", s, s, cap(s)) } }
所以為了避免程序運(yùn)行中的頻繁的資源開(kāi)銷,在某些場(chǎng)景下建議預(yù)留出足夠多的空間。
copy
兩個(gè)slice之間復(fù)制數(shù)據(jù)時(shí),允許指向同一個(gè)底層數(shù)組,并允許目標(biāo)區(qū)間重疊。最終復(fù)制的長(zhǎng)度以較短的切片長(zhǎng)度(len)為準(zhǔn),比如:
{ s1 := []int{0, 1, 2, 3, 4, 5 ,6} s2 := []int{7, 8 ,9} copy(s1,s2) fmt.Println(s1,len(s1),cap(s1)) s1 = []int{0, 1, 2, 3, 4, 5 ,6} s2 = []int{7, 8 ,9} copy(s2,s1) fmt.Println(s2,len(s2),cap(s2)) }
那么可不可以在同一切片之間復(fù)制數(shù)據(jù)呢?
在項(xiàng)目開(kāi)發(fā)過(guò)程中,如果slice長(zhǎng)時(shí)間引用一個(gè)大數(shù)組中很小的片段,那么建議新建一個(gè)獨(dú)立的切片,并復(fù)制出所需的數(shù)據(jù),以便原數(shù)組內(nèi)存可以被gc及時(shí)釋優(yōu)化回收。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
分享標(biāo)題:golang數(shù)據(jù)二(切片)-創(chuàng)新互聯(lián)
鏈接分享:http://jinyejixie.com/article30/coijso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、服務(wù)器托管、企業(yè)網(wǎng)站制作、微信小程序、響應(yīng)式網(wǎng)站、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容