深刻學習golang(1)—數組與切片

數據(array)與切片(slice)

數組聲明:編程

ArrayType   = "[" ArrayLength "]" ElementType .數組

例如:app

var a [32] int函數

var b [3][5] inturl

 

在Go和C中,數組的工做方式有幾個重要的差異。在Go中,spa

(1)數組是值類型。將一個數組賦值給另外一個,會拷貝全部的元素。指針

(2) 若是你給函數傳遞一個數組,其將收到一個數組的拷貝,而不是它的指針。blog

(3)數組的大小是其類型的一部分,類型[10]int和[20]int是不一樣的。數組長度在聲明後,就不可更改。索引

 

切片聲明:ci

SliceType = "[" "]" ElementType .

例如:

var a []int

沒有初始化的slice爲nil。

 

切片(slice)對數組進行封裝,實際上,切片能夠當作大小能夠動態變化的數組,這一點相似C++中std::vector。就像std::vector在實際C++編程中大量使用同樣,Go中大多數的數組編程都是經過切片完成,而不是簡單數組。

 

通常來講,有兩種方式來初始化切片:

(1)經過數組

var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

var mySlice []int = myArray[:5]

 

(2)經過make

語法:

make([]T, length, capacity)

 

建立一個初始長度爲5,容量爲10爲切片,切片的每一個元素都爲0:

slice1 := make([]int, 5, 10)

 

建立一個長度爲5的切片,並初始化切片的每一個元素:

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

 

對於切片,最重要的特色就是長度是可變的:

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

fmt.Println("slice:", slice2)

 

slice2 = append(slice2, 6)

fmt.Println("slice:", slice2)

 

輸出:

slice: [1 2 3 4 5]

slice: [1 2 3 4 5 6]

 

函數append是GO專門爲切片增長元素而提供的一個內建函數。

 

切片持有對底層數組的引用,若是你將一個切片賦值給另外一個,兩者都將引用同一個數組。若是函數接受一個切片做爲參數,那麼其對切片的元素所作的改動,對於調用者是可見的,比如是傳遞了一個底層數組的指針。

 

func (f *File) Read(b []byte) (n int, err error)

這個os.File的Read方法,它接受一個切片參數,切片中的長度已經設定了要讀取的數據的上限。對於C/C++,須要同時提供一個緩衝區的指針,和緩衝區的大小:

int read(File* f, char* buf, int len)

從這裏能夠看到,GO的寫法要簡單一些。


 

切片(數組)的遍歷

 

在go語言中,遍歷切片或者數組,有兩種方式:

 

傳統方式:

 

for i := 0; i <len(mySlice); i++ {

fmt.Println("mySlice[", i, "] =", mySlice[i])

}

 

 

 

使用range表達式

 

range表達式有兩個返回值,第一個是索引,第二個是元素的值:

 

for i, v := range mySlice {

fmt.Println("mySlice[", i, "] =", v)

}

 

使用range讓代碼更加簡潔,因此在go編程中也更加經常使用。



做者:YY哥 
出處:http://www.cnblogs.com/hustcat/ 本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索