深入學習golang 1 陣列與切片

2022-03-15 22:28:55 字數 1877 閱讀 7128

陣列宣告:

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

var myslice int = myarray[:5]

(2)通過make

語法:make(t, length, capacity)

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

slice1 := make(int, 5, 10)

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

slice2 := int

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

slice2 := int

fmt.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; i 

fmt.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 第一種定義方法是很多人習慣的,主要是早期的影響,第二種方法才是最適合的定義方法,...