go的切片(slice)是go語言內建的一種資料結構。
在使用上,go的切片和c++ stl的vector有以下相同點:
都可以直接索引,像陣列一樣
隨著元素個數的增加,可以自動擴大容量。(每超過一次,則將容量擴充套件為當前的兩倍(go目前的版本就是兩倍擴充套件,而stl vector沒有明確規定,根據不同的實現版本,2倍或者1.幾(隱約記得visual studio2015似乎就是1.幾)都有)大小,並自動將原記憶體的資料拷貝到新記憶體中)
1.1 用"make"宣告切片
mslice :=
make([
]int,5
,10)// 建立乙個元素型別為int的切片。元素值預設初始化為0
fmt.
println
(mslice)
// 輸出:[0 0 0 0 0]
fmt.
println
("len:"
,len
(mslice)
)//輸出: len: 5
fmt.
println
("cap:"
,cap
(mslice)
)//輸出: cap: 10
可見,用make建立切片時,第二個引數指定了切片的長度(len),第三個引數指定了切片的容量(cap)。
長度:切片當前有多少個元素
容量:切片最多可以容納多少個元素。
1.2 用""宣告切片
type用於宣告切片,[…]type用於宣告陣列。
arr :=
[...
]int
//[...]int用於宣告乙個int型別的陣列,陣列長度由{}中的元素個數指定
slice_a :=
int//slice_a是乙個切片
var slice_b [
]int
= arr[:]
//slice_b也是乙個切片,並且切片的底層陣列就是arr。即,修改arr的元素值,會導致slice_a同步改變。
arr[0]
=9//會導致slice_b[0]也變成9
注意用陣列arr初始化切片slice_b 時,相當於將陣列arr設為切片slice_b 的底層陣列;直到切片slice_b 發生擴充套件而重新分配底層陣列,slice_b 才會與arr脫離聯絡。
mslice[2]
=4mslice =
(mslice,8)
fmt.
println
(mslice)
//輸出:[0 0 4 0 0 8]
fmt.
println
(mslice[:]
)//[:] 表明mslice的全部元素,輸出:[0 0 4 0 0 8]
fmt.
println
(mslice[2:
])//[2:] 表明mslice下標為2開始的元素,輸出:[4 0 0 8]
fmt.
println
(mslice[2:
4])//[2:4] 表明mslice下標為2~3的元素,輸出:[4 0]
fmt.
println
(mslice[:4
])//[:4] 表明mslice下標為0~3的元素,輸出:[0 0 4 0]
fmt.
println
("len:"
,len
(mslice)
)//輸出: len: 6
fmt.
println
("cap:"
,cap
(mslice)
)//輸出: cap: 10
需要強調的是,像c語言的陣列一樣,用』[索引]'訪問元素時,索引的大小不能超過len-1。
切片之所以叫做」切片「,就是為了表明它可以很方便的切來切去。
newslice := mslice[2:
4:6]
//在mslice的基礎上建立新切片newslice。
有以下三點需要說明:
mslice[i:j:k]這個語句必須滿足乙個約束,即i在上面的語句中,newslice的元素從mslice[2]開始。newslice的len為4-2=2,cap為6-2=4。mslice[i:j:k],其計算公式為len=j-i,cap=k-i。
在newslice或者mslice的cap擴充前,newslice依舊使用mslice之前使用的底層陣列來儲存資料。這表明對newslice進行修改,會影響mslice!反之亦然。什麼時候不再相互影響呢?那就是這兩個切片的任意乙個的cap擴充時,go會為了給切片分配新的記憶體,從這一刻起兩個切片在記憶體上才正式脫離共享關係。
go切片的copy和view的使用方法
語義理解切片 go 語言中的切片是 go 語言的乙個特色,從語義上來說,切片就是把乙個整體的東西切分成小的部分,那麼對於語言中的切片也是同理。舉個例子看如下 package main import fmt fun程式設計客棧c main fmt.println arr 2 6 arr 2 6 從下s...
python基礎 切片使用方法
切片是一種很常用的方法,用 來進行表示使用 1.基本用法 6 表示取0 5 六個字元列印結果是 000001 2.取中間的片段 print filename 6 10 表示取第6 9個字元列印結果 jpg 3.省略前面 print filename 5 4.省略後面 print filename 1...
go語言學習 陣列切片的建立和使用方法
陣列切片就像乙個指向陣列的指標,它擁有自己的資料結構,不僅僅是指標,陣列切片的資料結構可以抽象為以下三個變數 乙個指向原生陣列的指標 陣列切片的元素個數 陣列切片已分配的儲存空間 從底層實現來看,陣列切片實際上還是通過使用陣列來管理元素,這個有點像c 中陣列與vector的關係,並且可以被隨意傳遞而...