golang 切片 接口_一日看尽golang高级语法之slice
golang系列的文章包含多篇文章,總篇如下,其中包含各篇文章的指引
明月映江雪:golang系列——個(gè)人學(xué)習(xí)筆記總篇?zhuanlan.zhihu.com由于最近事情比較多,拖到現(xiàn)在才更新,另一方面,原計(jì)劃這一章的內(nèi)容將包括select、channel、方法、切片、范圍、集合和接口等內(nèi)容,但是實(shí)際寫的時(shí)候才發(fā)現(xiàn)這根本是癡人說夢,所以將這些內(nèi)容拆分講解。那直接進(jìn)入主題吧,本文將初步講解slice有關(guān)的內(nèi)容,如果同學(xué)們需要更詳細(xì)的講解,可以參考官方或其他資料,并歡迎大家一起討論。
slice——切片
高中生物觀察葉綠體時(shí)就有切片操作,即將葉片的組織切出薄薄的一片進(jìn)行觀察。同理,golang中的切片可以理解為切取內(nèi)存的一部分,也可以類比數(shù)組的某一個(gè)連續(xù)的空間。slice在golang的實(shí)現(xiàn)主要與3個(gè)元素相關(guān):指針、長度和容量。
- 指針:指向某存儲數(shù)據(jù)的連續(xù)內(nèi)存空間,簡單的說就是你要在哪兒切;
- 長度:需要切的元素的數(shù)量,簡單的說就是你要切多少;
- 容量:最多能切的元素的數(shù)量,簡單的說就是最多切多少,一點(diǎn)也不能多切。
切片的基本操作:
var sliceTmp []int //聲明,空切片,長度和容量都是0,指針為nil sliceTmp2 := []string{"a","b","c"} //初始化,長度和容量都是3 sliceTmp2[0] = "b" //修改sliceTmp2為"b","b","c" sliceTmp2 = append(sliceTmp2,"d") //添加元素 "b","b","c","d" var sliceTmp3 []string = sliceTmp2 //切片拷貝大家要記住:在任意基礎(chǔ)切片上進(jìn)行操作,如果生成新的切片和基礎(chǔ)切片公用內(nèi)存空間,那么修改公共內(nèi)存空間的內(nèi)容將影響所有使用該段公共內(nèi)存空間的變量。下面給大家舉個(gè)例子:
sliceTmp4 := []int{1,2,3,4,5,6} //長度為6,容量為6 var sliceTmp5 = sliceTmp4[1:4] //[2,3,4] sliceTmp5指針指向sliceTmp4[1],長度為3,容量為3//此時(shí)sliceTmp4和sliceTmp5公用[2,3,4]的內(nèi)存空間 sliceTmp5[1] = 0按照普遍邏輯,sliceTmp4理應(yīng)是[1,2,3,4,5,6], sliceTmp5是[2,0,4],但實(shí)際上,sliceTmp4變成[1,2,0,4,5,6],仿佛在修改sliceTmp5的時(shí)候把sliceTmp4也修改了。實(shí)際上,sliceTmp4和sliceTmp5使用同一段內(nèi)存空間。 注意:不能如下所示定義切片
var test []int{1,2,3,4,5,6}但是可以使用make內(nèi)建函數(shù)主動創(chuàng)建一個(gè)切片,如下所示,申請存儲int型數(shù)據(jù)的切片,長度和容量為3和4。
var test [] int = make([]int,3,4) //注意,使用make后已經(jīng)存在3個(gè)元素,make([]int,0,4)則無元素我們也可以用如下方式獲取切片的長度和容量:
len(test) //3 cap(test) //4切片的擴(kuò)容:
切片是支持動態(tài)擴(kuò)容的,擴(kuò)容的辦法有2個(gè):復(fù)制和追加
//復(fù)制, 新的slice為原來的2倍,先申請一個(gè)2倍的空間newSlice := make([]int, len(test),(cap(test)+1)*2) //避免test的容量為0copy(newSlice, test) //追加, 可以直接在test上追加test = append(test,1,2,3) //長度和容量都加3newSlice = append(test,1,2,3) //newSlice為新的變量,與test沒有公用空間 //一種特殊的追加方法,或者稱之為合并操作s1 := []int{1,1}s2 := []int{2,2}s3 := append(s1,s2...) //[1,1,2,2]切片的使用中容易出現(xiàn)內(nèi)容公用的情形,但是只要在使用slice的時(shí)候時(shí)刻考慮切片的三個(gè)要素:指針、長度和容量,就能排查出異常的公用,否則牽一發(fā)而動全身,所有有公用內(nèi)存的變量都會被改動。
切片的遍歷:
方法一:數(shù)組索引
for i:=0; i<len(s1); i++{doSomething }方法二:range
for index, value :=range s1{doSomething }函數(shù)傳參:
一般在函數(shù)傳參時(shí),我們都要尤其注意參數(shù)是傳值還是傳地址。在golang語言中函數(shù)傳參是傳值的,但是在傳遞切片時(shí)有點(diǎn)不一樣。由于切片是由三個(gè)參數(shù)共同影響的,其中指針在傳遞后依舊為原指針,即拷貝后仍然指向同一個(gè)地址,所以當(dāng)切片為參數(shù)時(shí),原切片依然可能被函數(shù)內(nèi)的操作所影響,這一點(diǎn)尤其要注意。
內(nèi)存浪費(fèi):
如前文所說,在某個(gè)基礎(chǔ)切片上進(jìn)行多次操作后,則可能產(chǎn)生很多個(gè)切片。假設(shè)基礎(chǔ)切片的長度為1W,而新產(chǎn)生的切片長度為10,如果基礎(chǔ)切片不會再被使用,那么建議申請長度為10的空間存儲新的切片,這樣基礎(chǔ)切片就能被回收,否則將長期駐留在內(nèi)容中,造成浪費(fèi)。
總結(jié)
以上是生活随笔為你收集整理的golang 切片 接口_一日看尽golang高级语法之slice的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python一年365天、初始水平值_2
- 下一篇: python copytree_pyth