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