數據(array)與切片(slice)
數組聲明:
ArrayType = "[" ArrayLength "]" ElementType .
例如:
var a [32] int
var b [3][5] int
在Go和C中,數組的工作方式有幾個重要的差別。在Go中,
(1)數組是值類型。將一個數組賦值給另一個,會拷貝所有的元素。
(2) 如果你給函數傳遞一個數組,其將收到一個數組的拷貝,而不是它的指針。
(3)數組的大小是其類型的一部分,類型[10]int和[20]int是不同的。數組長度在聲明后,就不可更改。
切片聲明:
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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
