切片(slice)是對陣列的乙個連續片段的引用,所以切片是乙個引用型別(因此更類似於 c/c++ 中的陣列型別,或者 python 中的 list 型別),這個片段可以是整個陣列,也可以是由起始和終止索引標識的一些項的子集,需要注意的是,終止索引標識的項不包括在切片內。
go語言中切片的內部結構包含位址、大小和容量,切片一般用於快速地操作一塊資料集合,如果將資料集合比作切糕的話,切片就是你要的「那一塊」,切的過程包含從**開始(切片的起始位置)及切多大(切片的大小),容量可以理解為裝切片的口袋大小,如下圖所示:
切片預設指向一段連續記憶體區域,可以是陣列,也可以是切片本身。
從連續記憶體區域生成切片是常見的操作,格式如下:
slice [開始位置 : 結束位置]
語法說明如下:
從陣列或切片生成新的切片擁有如下特性:
根據索引位置取切片 slice 元素值時,取值範圍是(0~len(slice)-1),超界會報執行時錯誤,生成切片時,結束位置可以填寫 len(slice) 但不會報錯。
除了可以從原有的陣列或者切片中生成切片外,也可以宣告乙個新的切片,每一種型別都可以擁有其切片型別,表示多個相同型別元素的連續集合,因此切片型別也可以被宣告,切片型別宣告格式如下:
var name type
其中 name 表示切片的變數名,type 表示切片對應的元素型別。
如果需要動態地建立乙個切片,可以使用 make() 內建函式,格式如下:
make( type, size, cap )
其中 type 是指切片的元素型別,size 指的是為這個型別分配多少個元素,cap 為預分配的元素數量,這個值設定後不影響 size,只是能提前分配空間,降低多次分配空間造成的效能問題。
var a int
切片在擴容時,容量的擴充套件規律是按容量的 2 倍數進行擴充,例如 1、2、4、8、16……
go語言的內建函式 copy() 可以將乙個陣列切片複製到另乙個陣列切片中,如果加入的兩個陣列切片不一樣大,就會按照其中較小的那個陣列切片的元素個數進行複製。
copy() 函式的使用格式如下:
copy( destslice, srcslice t) int
其中 srcslice 為資料**切片,destslice 為複製的目標(也就是將 srcslice 複製到 destslice),目標切片必須分配過空間且足夠承載複製的元素個數,並且**和目標的型別必須一致,copy() 函式的返回值表示實際發生複製的元素個數。
go語言並沒有對刪除切片元素提供專用的語法或者介面,需要使用切片本身的特性來刪除元素,根據要刪除元素的位置有三種情況,分別是從開頭位置刪除、從中間位置刪除和從尾部刪除,其中刪除切片尾部的元素速度最快。
刪除開頭的元素可以直接移動資料指標:
a = int
a = a[1:] // 刪除開頭1個元素
a = a[n:] // 刪除開頭n個元素
a = int
還可以用 copy() 函式來刪除開頭的元素:
a = int
a = a[:copy(a, a[1:])] // 刪除開頭1個元素
a = a[:copy(a, a[n:])] // 刪除開頭n個元素
a = int
a = a[:i+copy(a[i:], a[i+1:])] // 刪除中間1個元素
a = a[:i+copy(a[i:], a[i+n:])] // 刪除中間n個元素
a = int
a = a[:len(a)-1] // 刪除尾部1個元素
a = a[:len(a)-n] // 刪除尾部n個元素
我們在上面已經說過切片在新增資料的過程中會進行擴容,下面通過乙個例子說明一下:
var bytes byte = byte
func main()
bytes2:=byte
fmt.printf("切片的長度=%d,容量=%d \n",len(bytes1),cap(bytes1))
}
輸出結果為
切片的長度=14,容量=14
切片的長度=14,容量=16
也就是切片的容量變大了,如果我們想讓拼接到一起的切片長度和容量一樣,我們可以利用陣列來實現
var tagrdata [14]byte
copy(tagrdata[:], bytes)
fmt.printf("切片的長度=%d,容量=%d",len(tagrdata),cap(tagrdata))
輸出結果為
切片的長度=14,容量=14
Go語言切片
go語言切片 go語言切片是對陣列的抽象 go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,go中提供了一種靈活,功能強悍的內建型別切片 動態陣列 與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。宣告乙個未指定大小的陣列來定義切片 var identifier ...
go語言 切片
一 概述 low 陣列下標的起點 high 陣列下標的結束點 不包括此點 arr low arr high len 長度 high low cap 容量 max low 二 切片的長度與容量 package main import fmt func main slice arr 0 3 5 fmt....
Go語言 切片
因為陣列的長度是固定的並且陣列長度屬於型別的一部分,所以陣列有很多的侷限性。例如 func arraysum x 3 int int return sum 這個求和函式只能接受 3 int型別,其他的都不支援。再比如,a 3 int陣列a中已經有三個元素了,我們不能再繼續往陣列a中新增新元素了。切片...