陣列宣告:
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]intvar myslice int = myarray[:5]
(2)通過make
語法:make(t, length, capacity)
建立乙個初始長度為5,容量為10為切片,切片的每個元素都為0:
slice1 := make(int, 5, 10)
建立乙個長度為5的切片,並初始化切片的每個元素:
slice2 := int
對於切片,最重要的特點就是長度是可變的:
slice2 := intfmt.println("slice:", slice2)
fmt.println("slice:", slice2)
輸出:
slice: [1 2 3 4 5]slice: [1 2 3 4 5 6]
切片持有對底層陣列的引用,如果你將乙個切片賦值給另乙個,二者都將引用同乙個陣列。如果函式接受乙個切片作為引數,那麼其對切片的元素所做的改動,對於呼叫者是可見的,好比是傳遞了乙個底層陣列的指標。
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; ifmt.println("myslice[", i, "] =", myslice[i])
}
使用range表示式
range表示式有兩個返回值,第乙個是索引,第二個是元素的值:
for i, v := range myslice
使用range讓**更加簡潔,所以在go程式設計中也更加常用。
本文版權歸作者和共有,歡迎**,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。
深入學習陣列
深入學習一下陣列 從記憶體角度來理解陣列 1 從內在角度講,陣列變數就是一次分配多個變數,而且這多個變數在記憶體中的儲存單元是次相連線的。2 我們分開定義多個變數 譬如inta,b,c,d 和一次定義乙個陣列 int a 4 這兩種定義方法相同點是都定義了4個int型變星,而且這4個變星都是獨立的單...
DNS深入學習 1
主要貢獻者包括 micha k pie jan piet mens,andrew babichev,jacob hoffman andrews,peter van dijk,nathan froyd,gene mcculley,charles henri bruyand,jose nazario,w...
陣列的深入學習
在以前的學習中,對陣列的認識只是簡單的陣列形式,儲存數,但深入學習其實現機理,發現大有文章,下面簡單表述一下 一 陣列是乙個型別,這個從陣列的定義說起 陣列的定義有兩種方式 以int為例,1.int a 2.int a 第一種定義方法是很多人習慣的,主要是早期的影響,第二種方法才是最適合的定義方法,...