七、Go語言切片(Slice)
Go 語言切片是對數(shù)組的抽象舞萄。
Go 數(shù)組的長度不可改變眨补,在特定場景中這樣的集合就不太適用,Go中提供了一種靈活倒脓,功能強悍的內(nèi)置類型切片("動態(tài)數(shù)組"),與數(shù)組相比切片的長度是不固定的撑螺,可以追加元素,在追加時可能使切片的容量增大崎弃。
定義切片
- 通過聲明一個未制定大小的數(shù)組來定義切片:
var identifier []int
- 使用make()函數(shù)創(chuàng)建切片:
var slice1 []type = make([]type, len)
//也可以簡寫為
slice1 := make([]type, len)
//使用參數(shù)capacity定義容量
make([]T, length, capacity)
初始化切片
- 直接初始化:
s :=[] int {1,2,3 }
//直接初始化切片s = {1,2,3}甘晤,此時len = cap = 3
- 引用數(shù)組:
s := arr[:]
//初始化切片s為數(shù)組arr的引用,:前后可以傳索引饲做,該方法也可以引用切片生成一個新的切片
切片的len()和cap()
切片是可索引的线婚,并且可以由 len() 方法獲取長度。
切片提供了計算容量的方法 cap() 可以測量切片最長可以達到多少盆均。
空切片
一個切片在未初始化之前默認為nil塞弊,長度為0。
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
if(numbers == nil){
fmt.Printf("切片是空的")
}
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
//輸出
len=0 cap=0 slice=[]
切片是空的
切片截取
即使用[lower_index:upper_index]對切片進行截取,:兩邊都不是必傳參數(shù)游沿。
append() 和 copy()函數(shù)
使用append()添加元素饰抒,使用copy()函數(shù)復制切片到一個新的切片。
package main
import "fmt"
func main() {
var numbers []int
printSlice(numbers)
/* 允許追加空切片 */
numbers = append(numbers, 0)
printSlice(numbers)
/* 向切片添加一個元素 */
numbers = append(numbers, 1)
printSlice(numbers)
/* 同時添加多個元素 */
numbers = append(numbers, 2,3,4)
printSlice(numbers)
/* 創(chuàng)建切片 numbers1 是之前切片的兩倍容量*/
numbers1 := make([]int, len(numbers), (cap(numbers))*2)
/* 拷貝 numbers 的內(nèi)容到 numbers1 */
copy(numbers1,numbers)
printSlice(numbers1)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}