1. 程式人生 > >Go語言的切片

Go語言的切片

可選 默認 代碼 slice ont [] 追加 pac 通過

Go 語言切片(Slice)

Go 語言切片是對數組的抽象。

Go 數組的長度不可改變,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活,功能強悍的內置類型切片("動態數組"),與數組相比切片的長度是不固定的,可以追加元素,在追加時可能使切片的容量增大。

定義切片

你可以聲明一個未指定大小的數組來定義切片:

var identifier []type

切片不需要說明長度。

或使用make()函數來創建切片:

var slice1  = make([] type, len)

或者寫成如下
slice1 := make([] type, len)

也可以指定容量,其中capacity為可選參數

slice1 := make([] type, len, capacity)

切片的實例

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 func main() {
 8     //初始化數組blance,元素為1,2,3,4,5,6
 9     var blance = [] int{1, 2, 3, 4, 5, 6}
10     //初始化數組slice1因為沒有給值,所以默認填充了3個0
11     var slice1 = make([] int,3 ,5)
12 
13     //輸出數組的初始化的值
14     fmt.Println("
初始化數組blance的值:", blance) 15 fmt.Println("初始化數組slice1的值:", slice1) 16 17 //切片的操作,可以通過索引取值 18 fmt.Println("blance數組中第二個索引的值為:",blance[2]) 19 20 //修改blance數組中最後一個值 21 blance[5] = 10000 22 fmt.Println("修改blance數組最後一個值以後的結果:",blance) 23 24 //使用切片給s數組賦值,從blance數組中的第0個索引取到第三個索引,但不包含第三個索引的值
25 s := blance[:3] 26 fmt.Println("blance數組切片獲取的數組s的值:", s) 27 28 }

以上代碼執行的結果:

初始化數組blance的值: [1 2 3 4 5 6]
初始化數組slice1的值: [0 0 0]
blance數組中第二個索引的值為: 3
修改blance數組最後一個值以後的結果: [1 2 3 4 5 10000]
blance數組切片獲取的數組s的值: [1 2 3]

len() 和 cap() 函數

切片是可索引的,並且可以由 len() 方法獲取長度。

切片提供了計算容量的方法 cap() 可以測量切片最長可以達到多少

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 //len可以獲取數組的總長度,cap可以獲取切片最大的長度
 8 func printSlice(x [] int,name string ){
 9     fmt.Printf("len=%d cap=%d %v=%v \n", len(x), cap(x) ,name , x )
10     fmt.Println("--------------------------------")
11 }
12 
13 func main() {
14     //初始化數組blance,元素為1,2,3,4,5,6
15     var blance = [] int{1, 2, 3, 4, 5, 6}
16 
17     //調用打印切片的函數
18     printSlice(blance,"blance")
19 
20     //初始化一次數組最大長度為8個,初始化填充3個0的數組s
21     s := make([] int,3 ,8)
22     fmt.Println("初始化數組s的值為:", s)
23 
24     //調用打印切片的函數
25     printSlice(s,"s")
26 
27 }

以上代碼執行的結果:

len=6 cap=6 blance=[1 2 3 4 5 6] 
--------------------------------
初始化數組s的值為: [0 0 0]
len=3 cap=8 s=[0 0 0] 
--------------------------------

append() 和 copy() 函數

如果想增加切片的容量,我們必須創建一個新的更大的切片並把原分片的內容都拷貝過來。

下面的代碼描述了從拷貝切片的 copy 方法和向切片追加新元素的 append 方法。

 1 package main
 2 
 3 import (
 4     "fmt"
 5 )
 6 
 7 //len可以獲取數組的總長度,cap可以獲取切片最大的長度
 8 func printSlice(x [] int,name string ){
 9     fmt.Printf("len=%d cap=%d %v=%v \n", len(x), cap(x) ,name , x )
10     fmt.Println("--------------------------------")
11 }
12 
13 func main() {
14     var numbers [] int
15     printSlice(numbers,"numbers")
16 
17     //追加空切片
18     numbers = append(numbers,)
19     printSlice(numbers,"numbers")
20 
21     //追加一個元素
22     numbers = append(numbers,1)
23     printSlice(numbers,"numbers")
24 
25     //同時追加多個元素
26     numbers = append(numbers,9, 9, 81)
27     printSlice(numbers,"numbers")
28 
29     //創建n1數組是numbers的兩倍的容量
30     n1 := make([] int, len(numbers), len(numbers)*2)
31     printSlice(n1,"n1")
32 
33     //拷貝numbers數組中的內容到n1中,會在對應的索引的地方覆蓋已有的內容
34     copy(n1, numbers)
35     printSlice(n1,"n1")
36 
37     //聲明局部數據test,初始化元素兩個2,數組允許最大3個元素
38     test := make([] int,2,3)
39     printSlice(test,"test")
40     //往test數組中添加數據,因為超過了最大長度的3個,go會維持內存,會另外申請一個乘以最大容量*2的容量賦值給test數組
41     test = append(test,1, 2 ,3)
42     printSlice(test,"test")
43 }

以上代碼執行的結果:

len=0 cap=0 numbers=[] 
--------------------------------
len=0 cap=0 numbers=[] 
--------------------------------
len=1 cap=1 numbers=[1] 
--------------------------------
len=4 cap=4 numbers=[1 9 9 81] 
--------------------------------
len=4 cap=8 n1=[0 0 0 0] 
--------------------------------
len=4 cap=8 n1=[1 9 9 81] 
--------------------------------
len=2 cap=3 test=[0 0] 
--------------------------------
len=5 cap=6 test=[0 0 1 2 3] 
--------------------------------

Go語言的切片