Go語言學習8 深入理解切片slice

2021-09-24 15:17:11 字數 2779 閱讀 6644

slice是個結構體,原始碼如下:

// runtime/slice.go

type slice struct

slice 共有三個屬性:

注意,底層陣列是可以被多個 slice 同時指向的,因此對乙個 slice 的元素進行操作是有可能影響到其他 slice 的。

建立 slice 的方式有以下幾種:

序號方式

**示例

1直接宣告varvar slice int

2newslice := *new(int)

3字面量:=slice := int

4makeslice := make(int, 5, 10)

5從切片或陣列「擷取」

slice := array[1:5]slice := sourceslice[1:5]

不同方式建立出來的切片分為 nil切片 和 空切片。

建立方式

nil切片

空切片方式一

var s1 intvar s2 = int{}

方式二var s4 = *new(int)var s3 = make(int, 0)長度0

0容量00

和 nil 比較

true

false

擷取也是比較常見的一種建立 slice 的方法,可以從陣列或者 slice 直接擷取,當然需要指定起止索引位置。新 slice 和老 slice 或陣列共用底層陣列,新老 slice 對底層陣列的更改都會影響到彼此。

slice := data[2:

4]// data[low, high]

slice := data[2:

4:6]

// data[low, high, max]

一般來說,擷取後的第乙個元素是low索引的元素,最後乙個元素是high-1索引的元素。

最大容量則只能是索引max-1處的元素。high 和 max 必須在老陣列或者老 slice 的容量(cap)範圍內。

當 high == low 時,新 slice 為空slice

package main

import

"fmt"

func

main()

s1 := slice[2:

5]s2 := s1[2:

6:7]

s2 =

(s2,

100)

s2 =

(s2,

200)

s1[2]

=20fmt.

println

(s1)

fmt.

println

(s2)

fmt.

println

(slice)

}

先看下**執行的結果:

[23

20][4

567100

200][0

12320

567100

9]

我們來走一遍**,初始狀態如下:

slice :=

ints1 := slice[2:

5]s2 := s1[2:

6:7]

s1 從 slice 索引2到索引4,長度為3,容量預設到陣列結尾,為8。 s2 從 s1 的索引2到索引5,容量到索引6,為5。

接著,向 s2 尾部追加乙個元素 100:

s2 =

(s2,

100)

s2 容量剛好夠,直接追加。不過,這會修改原始陣列對應位置的元素。這一改動,陣列和 s1 都可以看得到。

再次向 s2 追加元素200:

s2 =

(s2,

100)

s1[2]

=20

這次只會影響原始陣列相應位置的元素。它影響不到 s2 了,人家已經遠走高飛了。

再提一點,列印 s1 的時候,只會列印出 s1 長度以內的元素。所以,只會列印出3個元素,雖然它的底層陣列不止3個元素。

slice =

(slice, elem1, elem2)

slice =

(slice, anotherslice...

)

**:深度解密go語言之sli

GO語言學習 切片

切片的長度可以用len獲得,容量由cap獲得.s1 make int,5 len s1 可以得到長度為5,cap s1 可以得到容量為5 s2 make int,5,8 len s2 可以得到長度為5,cap s2 可以得到容量為8 在s1中我沒有用make說明此切片的容量,因此他的容量和長度相等都...

深入理解Go語言中的陣列和切片

一 型別 陣列是值型別,將乙個陣列賦值給另乙個陣列時,傳遞的是乙份拷貝。切片是引用型別,切片包裝的陣列稱為該切片的底層陣列。我們來看一段 a是乙個陣列,注意陣列是乙個固定長度的,初始化時候必須要指定長程式設計客棧度,不指定長度的話就是切片了 a 3 int b是陣列,是a的乙份拷貝 b a c是切片...

Go語言學習十一 go語言切片

go 語言切片是對陣列的抽象。go 陣列的長度不可改變,在特定場景中這樣的集合就不太適用,go中提供了一種靈活,功能強悍的內建型別切片 動態陣列 與陣列相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。你可以宣告乙個未指定大小的陣列來定義切片 var identifier typ...