slice是個結構體,原始碼如下:
// runtime/slice.go
type slice struct
slice 共有三個屬性:
注意,底層陣列是可以被多個 slice 同時指向的,因此對乙個 slice 的元素進行操作是有可能影響到其他 slice 的。
建立 slice 的方式有以下幾種:
序號方式
**示例
1直接宣告var
var slice int
2new
slice := *new(int)
3字面量:=
slice := int
4make
slice := make(int, 5, 10)
5從切片或陣列「擷取」
slice := array[1:5]
或slice := sourceslice[1:5]
不同方式建立出來的切片分為 nil切片 和 空切片。
建立方式
nil切片
空切片方式一
var s1 int
var 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...