這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
學習Golang語言(1): Hello World
學習Golang語言(2): 變數
學習Golang語言(3):類型--布爾型和數實值型別
學習Golang語言(4):類型--字串
學習Golang語言(5):類型--數組
學習Golang語言(6):類型--切片
在很多應用情境中,數組不能夠滿足我們的需求。在初始定義數組時,我們並不知道數組所需的長度。因此,我們需要一個大小可以動態變化的數組(動態數組)
在Go語言中,這種“動態數組”成為slice(切片)。
但是實際上slice並不是真正意義上的動態數組,而是一個參考型別。slice總是指向一個底層array,slice的聲明可以像array一樣。但是它不需要聲明長度。slice的長度是可變的。
嚴格來講,slice有兩個屬性容量(capacity)和長度(length),其中容量>=長度。
切片(slice)的聲明
切片可以通過以下方式建立。
1、先聲明一個變數是切片,再使用內建函數make去初始化這個切片。
這裡首先使用make函數定義切片slice1,這個時候slice1的容量=5;長度=5;然後使用make函數定義切片slice2,這個時候slice2的容量=10,長度=5;
因此可以看出使用make定義切片有兩種方式,
只指定長度,這個時候切片長度和容量相同;
同時指定切片的長度和容量。
--------------------注意--------------------
1、在容量大於長度時候,賦值仍需要注意最大的索引仍然是len(slice)-1,否則會報索引超出邊界的錯誤。
2、使用:=符號在聲明一個切片同時初始化資料,如下所示。
slice := []byte{'a','b','c','d','e'}
3、切片可以從數組或者一個已經存在的slice中再次聲明。切片通過array[i:j]來擷取數組index從i到j之間的元素。其中i是開始的位置,j是借宿的位置。但是不包含array[j],長度為j-i。
---------------------------------------------
此外:數組聲明時候方括弧內需要寫明數組的長度或者使用(...)符號自動計算長度。而切片聲明時,方括弧內沒有任何字元。
切片還有一些簡便的操作
切片預設開始位置為0,slice[:n]等價於slice[0:n];
切片的第二個序列預設是數組的長度,slice[n:]等價於slice[n:len(slice)];
如果從一個數組裡面直接擷取切片,可以這樣slice[:],因為預設第一序列為0,第二個序列為len(slice),因此slice[:]等價於slice[0:len(slice)]。
例如:
輸出結果:
由於切片是參考型別,因此當引用改變其中元素的值時候,其他的所有引用都會改變該值。例如:
輸出結果
當我們把slice1[3]修改為100時候,slice2[0]也變為100.
---------------------------------------------
從概念上看,切片像是一個結構體,包含了三個元素:
---------------------------------------------
切片的重要特徵:長度可變,可以通過以下例子瞭解。
append追加元素
輸出結果
這裡我們初始化slice為容量=8;長度=4的切片。然後為前四個元素賦值並輸出結果。再者使用Go的內建函數append為slice追加6個元素。
這個時候查看slice的容量=16和長度=10以及切片元素。發現slice的長度確實變化。
--------------------注意--------------------
append進行追加元素時
上述例子看出:容量從原先的8=>16.
---------------------------------------------
上面介紹了使用append函數給切片增加元素,現在再來介紹一個copy函數:用來從一個切片拷貝元素到另一個切片。
copy複製元素
輸出結果
在上面的例子中,我們將slice1的元素拷貝到slice2,因為slice2的長度為5,因此最多拷貝5個元素。
--------------------總結--------------------
數組聲明時候方括弧內需要寫明數組的長度或者使用(...)符號自動計算長度。而切片聲明時,方括弧內沒有任何字元。
因為數組長度固定,而切片長度可變。
---------------------------------------------
歡迎關注碼術!一起學習Golang語言。