(二)golang數組和切片

一、數組

golang中的數組是一種由固定長度和固定對象類型所組成的數據類型。例以下面:golang

var a [4]int

a是一個擁有4個int類型元素的數組。當a一旦被聲明以後,元素個數就被固定了下來,在a這個變量的生命週期以內,元素個數不會發生變化。而此時a的類型就是[4]int,若是同時存在一個b變量,爲[5]int。即使兩個變量僅僅相差一個元素,那麼在內存中也佔據着徹底不一樣的地址分配單元,a和b就是兩個徹底不一樣的數據類型。在golang中,數組一旦被定義了,那麼其內部的元素就完成了初始化。也就是時候a[0]等於0。
   在golang當中,一個數組就是一個數據實體對象。在golang當使用a時,就表明再使用a這個數組。而在C中,當使用a時,則表明着這個數組第一個元素的指針。數組

二、切片

letters := []string{"a", "b", "c", "d"}

數組聲明時候方括號內須要寫明數組的長度或者使用(...)符號自動計算長度,切片不須要指定數組的長度。比較規範的聲明方式是使用make,大體有兩種方式app

一、只指定長度,這個時候切片長度和容量相同;函數

二、同時指定切片的長度和容量。指針

var s1 = make([]byte, 5)
var s2 = make([]byte, 5, 10)

因爲切片是 引用類型 ,所以當引用改變其中元素的值時候,其餘的全部引用都會改變該值。例如code

var a = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s1 := a[:4]
s2 := a[3:7]
fmt.Println(s1)
fmt.Println(s2)
s1[3] = 100
fmt.Println(s1)
fmt.Println(s2)

結果是:對象

[1 2 3 4]生命週期

[4 5 6 7]內存

[1 2 3 100]get

[100 5 6 7]

從概念上看,切片像是一個結構體,包含了三個元素:

一、一個指向數組中切片指定的開始位置;

二、長度,即切片的長度,經過內置函數len得到;

三、最大長度,即切片的最大容量,經過內置函數cap得到。

若是len比cap還大,那麼就會觸發運行時異常。

    golang提供append函數來添加元素,當使用append函數時,append函數會判斷目的切片是否具備剩餘空間,若是沒有剩餘空間,則會自動擴充兩倍空間。

    golang提供copy用於將內容從一個數組切片複製到另外一個數組切片。若是加入的兩個數組切片不同大,就會按其中較小的那個數組切片的元素個數進行復制。

slice1 := []int{1, 2, 3, 4, 5} 
slice2 := []int{5, 4, 3} 

copy(slice2, slice1) // 只會複製slice1的前3個元素到slice2中 
copy(slice1, slice2) // 只會複製slice2的3個元素到slice1的前3個位置

切片詳解

http://www.jianshu.com/p/030a...

相關文章
相關標籤/搜索