Go切片的使用方法

2021-09-26 20:12:22 字數 2407 閱讀 4847

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的關係,並且可以被隨意傳遞而...