切片創建和初始化
slice := make([]string, 5)
slice := make([]int,3,5)
slice := []int{1,2,3}
如果只指定長度,那么切片的容量和長度相等。也可以分別指定長度和容量
// 創建一個整型切片, 長度為3個元素,容量為5個元素
slice := make([]int, 3, 5)
// 創建一個整型切片 ,長度和容量都是4個元素
slice := []int{10, 20, 30, 40}
不允許創建容量小于長度的切片,
容量小于長度的切片會在編譯時報錯
// 創建一個整型切片 , 使其長度大于容量
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支持一些更加復雜的功能。有一個就是內置的append,可以在現有的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
因為迭代返回的變量是一個迭代過程中根據切片依次賦值的新變量,所以value的地址總是相同的。要想獲取每個元素的地址,可以使用切片變量和索引值。
如果不需要索引值,可以使用占位字符來忽略這個值,使用空白標識符(下劃線)來忽略索引值
// 創建一個整型切片,長度和容量都是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切片)。只要在聲明時不做任何初始化,就會創建一個nil切片。
// 創建nil整型切片
var slice []int
在Go語言里,nil切片是很常見的創建切片的方法。nil切片可以用于很多標準庫和內置函數。在需要描述一個不存在的切片時,nil切片會很好用。例如,函數要求返回一個切片但是發生異常的時候
// 使用make創建空的整型切片
slice := make([]int, 0)
// 使用切片字面量創建空的整型切片
slice := []int{}
空切片在底層數組包含0個元素,也沒有分配任何存儲空間。想表示空集合時空切片很有用,例如,數據庫查詢返回0個查詢結果時。