切片創(chuàng)建和初始化
slice := make([]string, 5)
slice := make([]int,3,5)
slice := []int{1,2,3}
如果只指定長度祠肥,那么切片的容量和長度相等时捌。也可以分別指定長度和容量
// 創(chuàng)建一個整型切片, 長度為3個元素,容量為5個元素
slice := make([]int, 3, 5)
// 創(chuàng)建一個整型切片 ,長度和容量都是4個元素
slice := []int{10, 20, 30, 40}
不允許創(chuàng)建容量小于長度的切片巩踏,
容量小于長度的切片會在編譯時報錯
// 創(chuàng)建一個整型切片 , 使其長度大于容量
slice := make([]int, 5, 3)
Compiler Error:
len larger than cap in make([]int)
slice 常用賦值方式
1 通過index賦值
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
2 通過append賦值
相對于這些基本的操作球拦,slices支持一些更加復(fù)雜的功能靠闭。有一個就是內(nèi)置的append,可以在現(xiàn)有的slice對象上添加一個或多個值坎炼。注意要對返回的append對象重新賦值阎毅,以獲取最新的添加了元素的slice對象。
? ? s = append(s, "d")
? ? s = append(s, "e", "f")
? ? fmt.Println("apd:", s)
import "sort"
var m map[int]string
var keys []int
for k := range m {
? ? keys = append(keys, k)
}
sort.Ints(keys)
for _, k := range keys {
? ? fmt.Println("Key:", k, "Value:", m[k])
}
切片迭代
// 迭代每個元素点弯,并顯示值和地址
for index, value := range slice {
fmt.Printf("Value: %d Value-Addr: %X ElemAddr: %X\n",
value, &value, &slice[index])
}
Output:
Value: 10 Value-Addr: 10500168 ElemAddr: 1052E100
Value: 20 Value-Addr: 10500168 ElemAddr: 1052E104
Value: 30 Value-Addr: 10500168 ElemAddr: 1052E108
Value: 40 Value-Addr: 10500168 ElemAddr: 1052E10C
因為迭代返回的變量是一個迭代過程中根據(jù)切片依次賦值的新變量,所以value的地址總是相同的矿咕。要想獲取每個元素的地址抢肛,可以使用切片變量和索引值。
如果不需要索引值碳柱,可以使用占位字符來忽略這個值捡絮,使用空白標識符(下劃線)來忽略索引值
// 創(chuàng)建一個整型切片,長度和容量都是4個元素
slice := []int{10, 20, 30, 40}
/ /迭代每個元素莲镣,并顯示其值
for _, value := range slice {
fmt.Printf("Value: %d\n", value)
}
Output:
Value: 10
Value: 20
Value: 30
Value: 40
空切片
有時福稳,程序可能需要聲明一個值為nil的切片(也稱nil切片)。只要在聲明時不做任何初始化瑞侮,就會創(chuàng)建一個nil切片的圆。
// 創(chuàng)建nil整型切片
var slice []int
在Go語言里鼓拧,nil切片是很常見的創(chuàng)建切片的方法。nil切片可以用于很多標準庫和內(nèi)置函數(shù)越妈。在需要描述一個不存在的切片時季俩,nil切片會很好用。例如梅掠,函數(shù)要求返回一個切片但是發(fā)生異常的時候
// 使用make創(chuàng)建空的整型切片
slice := make([]int, 0)
// 使用切片字面量創(chuàng)建空的整型切片
slice := []int{}
空切片在底層數(shù)組包含0個元素酌住,也沒有分配任何存儲空間。想表示空集合時空切片很有用阎抒,例如酪我,數(shù)據(jù)庫查詢返回0個查詢結(jié)果時。