區塊鏈技術語言(十八):Go語言切片(下)
上一節介紹了切片的基礎知識:切片的宣告、空切片、切片和陣列的區別、切片和底層陣列的關聯、切片的建立。這一節主要介紹切片的幾個操作(遍歷、追加、拷貝、插入、刪除),最後介紹切片作為函式引數的傳遞方式。
1
切片的幾個操作
1.1 對切片的遍歷
類似於對陣列的遍歷,range結合for迴圈可以對切片進行遍歷,格式為:

示例如下:

1.2 在切片中追加元素——append函式
一個切片,可以在其尾部追加新元素或某一切片的全部元素,返回新切片。
1.2.1 基於已知切片建立新切片的方式
append()函式是內建函式,可以在切片尾部追加與切片元素型別相同的元素,追加元素格式為:

注:注意slice_1後面要有“...”
1.2.2 追加元素後的新切片的容量變化
根據切片元素個數是否為0、是否聲明瞭容量值,追加元素後形成的新切片的容量變化不盡相同。
▷ 1.2.2.1 元素個數大於0且沒有宣告容量值的切片
如果一個切片slice的元素個數大於0,且沒有宣告該切片的容量,追加元素形成的新切片的容量變化如下:
a.切片slice的長度和容量均等於切片的元素個數(假設為t,t>0),則:
cap(slice)=len(slice)=t
b.對此切片追加元素,形成新切片s1:
b1. 若t<len(s1)≤2t,則:cap(s1)=2t;
b2. 若len(s1)>2t,則:cap(s1)=len(s1)或cap(s1)=len(s1)+1,此時容量值必須是偶數。
c.再對此切片追加元素,重複步驟b。

▷1.2.2.1 元素個數為0且沒有宣告容量值的切片
如果一個切片slice僅僅宣告、沒有初始化,或者通過make()函式建立了長度為0、沒有宣告容量的新切片,追加元素形成新的切片的容量變化如下:
a.切片僅僅宣告,則此切片為空切片,則:
cap(slice)=len(slice)=0
或者用make()函式建立了長度為0、沒有宣告容量的新切片,則:
cap(slice)=len(slice)=0
b.對此切片追加元素(假設追加的元素個數為t),形成的切片為s1:
cap(s1)= len(s1)=t
c. 對此切片追加元素,形成的切片為s2:
c1. 若t<len(s2)≤2t,則:cap(s2)=2t;
c2. 若len(s1)>2t,則:cap(s2)=len(s2)或cap(s2)=len(s2)+1,此時容量必須是偶數。
d. 再對此切片追加元素,重複步驟c。

▷1.2.2.3 聲明瞭容量值的切片
如果一個切片slice通過make()函式完成了初始化(假設元素個數為r,r>0),也聲明瞭容量(假設容量為t,滿足t≥r),追加元素形成新的切片的容量變化如下:
a.此切片滿足:
len(slice)=r,cap(slice)=t
b.對此切片追加元素,形成新切片s1:
b1. 若len(s1)≤t,則:cap(s1)= t;
b2. 若t<len(s2)≤2t,則:cap(s1)=2t;
b3. 若len(s1)>2t,則:cap(s1)=len(s1)或cap(s1)=len(s1)+1,此時容量必須是偶數。
c.再對此切片追加元素,重複步驟b。

1.3 切片的拷貝——copy函式
1.3.1 切片的拷貝格式
已知兩個元素型別相同的切片s1、s2,Go語言的內建函式copy()可以將s2中的元素拷貝到s1中,其格式如下:

1.3.2 拷貝分類
copy(s1,s2)首先要保證s1、s2中的元素型別相同,元素型別不同是不能完成拷貝的。另外,不一定能將s2中的所有元素全部覆蓋到s1上。已知m=len(s1),n=len(s2),根據s1、s2中元素個數大小分為兩類:
a. 若m≥n,則切片s2中的元素全部覆蓋到切片s1中前n個元數,切片s1剩下(m-n)個元素仍然保留;
b. 若m<n,則切片s2中只有前m個元素能全部覆蓋到切片s1中。

1.4 在切片中插入元素
Go語言由於沒有insert函式,要實現切片的插入,即在切片slice中插入一個或多個和切片元素型別相同的元素,步驟如下:
a.在插入前,先選擇要插入的位置index;
b.將該位置之前的所有元素擷取,製成一個新切片s1;
c.將該位置及該位置後面的所有元素擷取,追加到空切片,製成新切片s2;
d.將元素a、b、c全部新增到s1中去;
e. 再將s2中的所有元素全部新增到s1中去。


1.5 刪除切片中的元素
由於Go語言沒有函式可以直接刪除其內部元素,要刪除切片slice中一個或多個元素,操作步驟如下:
a.在刪除前,先確認要刪除的元素位置index;
b.將包含這個位置之前的所有元素擷取,製成一個新切片s1;
c.將該位置後面的所有元素擷取,製成一個新切片s2;
d.將s2中的所有元素全部新增到s1尾部中去。


2
切片作為函式引數
在陣列那一章節我們介紹了陣列作為函式引數的傳遞方式:當實參是陣列本身,函式引數的傳遞方式是值傳遞;當實參是陣列的地址,則形參型別必須是陣列指標,函式引數的傳遞方式是引用傳遞。
而切片本身的資料結構裡存在一個指向底層陣列的指標,切片作為函式引數,其傳遞方式是引用傳遞。在自定義函式中對切片元素修改,將實際對切片進行了修改。
ofollow,noindex"> 原文連結:區塊鏈技術語言(十八):Go語言切片(下)
參考資料
[1] https://www.cnblogs.com/bonelee/p/6862627.html
本文完,獲取更多資訊,敬請關注區塊鏈工程師。
來源:鏈塊學院
本文由布洛克專欄作者釋出,代表作者觀點,版權歸作者所有,不代表布洛克科技觀點
——TheEnd——
關注“布洛克科技”