區塊鏈技術語言(十七):Go語言切片(上)
上一章節我們已經瞭解了陣列的特點:陣列的長度在定義之後無法再次修改;陣列是值型別,每次傳遞都將產生一份副本。陣列的這種特點無法滿足特定場景的開發需求,Go語言提供了更為靈活、功能強悍的內建型別——切片(slice)來彌補陣列的不足。
切片分為上、下兩節。本節介紹切片的基礎知識:切片的宣告、空切片、切片和陣列的區別和關聯、切片的建立。
1
切片的宣告
切片的宣告格式類似於陣列,其格式如下:
注:a. “[]”內部沒有任何符號,也沒有空格;
b. “[]”後面緊跟的是切片元素的型別;
c. 切片中的元素型別統一一致。
2
空切片
如果一個切片僅宣告卻沒有初始化,那麼這個切片就叫作空切片。

3
切片和陣列的區別
切片和陣列在格式宣告、本質和同型別之間是否可以比較有區別,如表1所示。

4
切片和底層陣列的關聯
切片是引用型別,總是指向一個底層陣列。但它不是指向底層陣列的指標,實際上它擁有自己的資料結構,指標僅僅是其內部資料結構的一部分。如圖1所示,切片的資料結構可以抽象為以下3個變數:
♦一個指標:指向底層陣列;
♦長度:即切片中的元素個數;
♦容量:即最大長度,切片已分配的儲存空間。
從底層實現的角度來看,切片實際上仍然使用陣列來管理元素。基於陣列,切片添加了一系列管理功能,可以隨時動態擴充存放空間。
5
切片的建立
建立切片的方法主要有三種:直接建立切片、基於陣列建立新切片、基於已知切片建立新切片。
5.1 直接建立切片
Go語言既可以通過宣告和賦值的方式建立切片,也提供了一種內建函式make()用於建立切片,其建立格式為:
注: length不可以省略,capacity可以省略;capacity省略,則預設和length值相同。
直接建立切片的方式有5種,如表2所示。
注:slice1的賦值語句,slice5、slice6、slice7、slice8賦值操作符語句是執行語句,必須在函式內部。
示例如下:

5.2 基於陣列建立新切片
切片可以基於一個已經存在的陣列建立。切片可以只使用陣列的一部分元素或者所有元素來建立。
基於陣列建立的切片,切片長度值等於所取陣列的元素個數,容量值等於切片第一個元素在陣列的位置距離陣列最後一個元素的距離。

示例如下:

5.3 基於已知切片建立新切片
切片可以基於一個已經存在的切片建立。新切片(reslice)可以只使用已有切片(slice)中的一部分元素或者整個元素來建立。
5.3.1 新建切片和已知切片、底層陣列 之間的 關係
每個切片都會指向對應的底層陣列。新切片基於已知切片的部分或全部元素建立,但新建片也指向底層陣列, 新切片中指標儲存的地址為新切片第一個元素在底層陣列中儲存的空間位置 。 如圖2所示,Slice_a指向底層陣列Array_ori,Slice_a資料結構中的指標儲存的是底層陣列Array_ori中c所在的空間地址。Slice_b基於Slice_a建立,此時Slice_b也指向該底層陣列Array_ori,Slice_b資料結構中的指標儲存的是底層陣列Array_ori中d所在的空間地址。
已知切片、新建切片的容量(capacity)等於切片中第一個元素在底層陣列的位置與底層陣列最後一個元素的位置距離。如圖2所示,陣列Array_ori的長度為11,容量也為11。切片Slice_a的長度為3,容量的計算方式為c在陣列的位置距離陣列最後一個元素k的距離,即為9;同理,切片Slice_b的長度為2,容量為陣列元素d距離陣列最後一個元素k的距離,即為8。



5.3.2 基於已知切片建立新切片的方式
基於已知切片建立新切片的操作方式如表4所示。


ofollow,noindex"> 原文連結:區塊鏈技術語言(十七):Go語言切片( 上 )
參考資料
[1] 許式偉,呂桂華.Go語言程式設計[M].北京:人民郵電出版社,2012:32.
本文完,獲取更多資訊,敬請關注區塊鏈工程師。
來源:鏈塊學院
本文由布洛克專欄作者釋出,代表作者觀點,版權歸作者所有,不代表布洛克科技觀點
——TheEnd——
關注“布洛克科技”