Go學習筆記-數組和切片

數組

數組是具備相同惟一類型的一組已編號且長度固定的數據項序列(同構的數據結構);這種類型能夠是任意的原始類型,例如整型、字符串或者自定義類型。python

數組長度必須是一個常量表達式,而且必須是一個非負整數。數組

數組成都也是數組類型的一部分,因此[5]int和[10]int是屬於不一樣類型的。數據結構

數組是一種值類型。ide

數組的編譯時,值初始化時按照數組順序完成的函數

知識擴展:1.PHP中的數組其實是一個有序映射。映射是一種把values關聯到keys的類型;2.C語言中的數組是指向首元素的指針spa

聲明的格式:var identifier [len]type。例如: var arr1 [5]int。指針

數組的特色:
  • 這種類型能夠是任意的原始類型,例如整型,字符串,自定義類型。
  • 數組長度必須是一個常量表達式,而且是一個非負數
  • 數組長度也是數組類型的一部分
數組長度的特色:
  • 數組索引從0開始
  • 元素的數目,也稱爲長度或者數組大小必須是固定的而且在聲明該數組時就給出
  • 數組長度最大爲2Gb

 備註:Go語言中的數組是一種值類型(C/C++中是指向首元素的指針)。Go中的數組能夠用new()來建立:var arr1 = new([5]int),這種方式建立出來的數組arr1的類型是*[5]int,而arr2的類型是[5]int。當把數組做爲參數傳給函數是,會產生一次賦值,函數就不會修改原始數組。code

arr1 := new([3]int)
arr2 := arr1
arr2[1] = 23
fmt.Println(arr1[1]) // 結果爲23,由於arr1的類型是*[3]int
 數組的變化形式
1 var arr1 = [5]int{1,2,3,4,5} // 也是寫成[5]int{1,2}其餘位置的值默認0
2 var arr2 = [...]int{1,2,3,4,5} // 從技術上說變成了切片
3 var arr3 = [5]string{2:'kobe',3:'paul'} // 索引23被賦值

 切片

切片(slice)是對數組一個連續片斷的引用(該數組咱們稱之爲相關數組,一般是匿名的),因此切片時一個引用類型。blog

聲明切片的格式是:var identifier []type (備註:不須要說明其長度索引

切片在未初始化以前爲nil,長度爲0。

切片的特色

  • 切片能夠是整個數組,或者是由其實和終止索引標識的一些項的子集(備註:終止索引標識的項不包括在切片內)
  • 切片時可索引額,而且能夠由len()函數獲取長度
  • 切片能夠在運行時修改,最小爲0最大爲相關數組的長度(備註:切片能夠理解成長度可變的數組,但這麼說本質上是不對的,形式上是)
  • 切片提供了計算容量的函數cap()能夠測量切片最長能夠達到多少。強調:切片長度永遠不會超過其容量(備註:容量的它所在數組的長度)
  • 由於切片是一個數組中的一部分,也就是說一個數組能夠有多個切片,那麼這些切片就是共享這個數組的數據。
  • 切片是引用類型,因此不須要額外的存儲空間,所以比數組的效率高

切片的建立

var slice1 = []int{1,2,3,4} // 建立了一個長度爲4的數組,並建立了一個相關切片
var slice2 = make([]int,5) // make([]type,len,cap)(cap可選參數)
var slice3 = new([]int) // slice3=nil,切片沒有被初始化,make()建立的會直接初始化。

切片的原理

  在內存中是一個3個域的結構體:指向相關數組的指針,切片長度及切片容量。

  

使用make生成切片的原理

  方式 var slice1 := make([]type,len,cap)  參數分別是切片類型,切片長度,切片容量。cap參數可選,若是忽略的話,默認建立的切片len=cap

1 //這兩種方法生成相同的切片,切片是引用類型,因此他們類型也是相同的 
2  make([]int,50,100)
3  new([100]int)[0:50]

  make()方法生成的切片的內存結構

  

相關文章
相關標籤/搜索