標籤:int import 取數 代碼 append copy 大小 賦值 pack
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個011 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] = 1000022 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,615 var blance = [] int{1, 2, 3, 4, 5, 6}16 17 //調用列印切片的函數18 printSlice(blance,"blance")19 20 //初始化一次數組最大長度為8個,初始化填充3個0的數組s21 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 [] int15 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語言的切片