Go语言提供的内置函数make()可以用于灵活的创建数组切片。make()函数创建一个指定元素类型、长度和容量的slice。容量部分可以省略,在这种情况下,容量将等于长度。在底层,make创建了一个匿名的数组变量,然后返回一个slice。只有通过返回的slice才能引用匿名的数组变量。
make([]T,len)
make([]T,len,cap)
内置的len()函数获取长度,内置的cap()函数获取容量。
slice1 := make([]int, 5)
slice2 := make([]int, 5, 10)
slice3 := []int{1, 2, 3, 4, 5}
fmt.Println(slice1, len(slice1), cap(slice1))
fmt.Println(slice2, len(slice2), cap(slice2))
fmt.Println(slice3, len(slice3), cap(slice3))
打印结果:
[0 0 0 0 0] 5 5
[0 0 0 0 0] 5 10
[1 2 3 4 5] 5 5
与数组相同,slice操作不能超出len指定的范围。
slice := make([]int, 5, 10)
slice[3] = 10 //正确
slice[8] = 8 //错误 ,索引超出范围
4 切片的遍历
切片的遍历与数组的遍历方式相同。
5 切片不能比较
与数组不同的是slice之间不能比较,因此我们不能使用==操作符来判断两个slice是否含有全部相等的元素。不过标准库提供了高度优化的bytes.Equal函数两个字节型slice是否相等,但是对于其它类型的slice,我们必须自己展开每个元素进行比较。
切片可遍历,可修改,不可比较
6 判断切片是否为空
使用len(s)==0来判断一个slice是否为空。
7 追加元素
内置的append函数用于向slice追加元素。可以直接追加元素,也可以追加一个slice。注意参数slice后有...。否则有语法错误。因为append()函数的语义是从第二个参数开始都应该是待附加的元素。slice后加...意味将slice的元素全部打散后传入。数组切片会自动处理存储空间不足的问题。如果追加的内容长度超过当前已分配的存储空间(即cap()调用返回的信息),数组切片会自动分配一块足够大的内存。
slice := make([]int, 5, 10)
slice = append(slice, 1, 2, 3)
fmt.Println(slice)
slice2 := []int{4, 5, 6}
slice = append(slice, slice2...)
fmt.Println(slice)
打印结果:
[0 0 0 0 0 1 2 3]
[0 0 0 0 0 1 2 3 4 5 6]
8 切片复制
内置的copy函数用于数组切片的复制。复制时无需考虑目标数组和源数组的长度。
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{7, 8, 9}
copy(slice2, slice1) //只会将slice1的前3个元素赋值给slice2
fmt.Println(slice2)
slice3 := []int{1, 2, 3, 4, 5}
slice4 := []int{7, 8, 9}
copy(slice3, slice4) //将slice4的元素赋值slice3的前3个元素
fmt.Println(slice3)
打印结果:
[1 2 3]
[7 8 9 4 5]
9 作为函数参数时切片与数组的区别
func SetValueByArray(arr [5]int) {
arr[0] = 100
}
func SetValueBySlice(slice []int) {
slice[0] = 100
}
func main() {
arr := [5]int{1, 2, 3, 4, 5}
SetValueByArray(arr)
fmt.Println(arr)
slice := arr[:]
SetValueBySlice(slice)
fmt.Println(arr)
}
//打印结果:
[1 2 3 4 5]
[100 2 3 4 5]
10字符串和byte切片
标准库中提供了4个与字符串操作相关的包:
包
功能
strings
提供了字符串查询、替换、比较、截断、拆分和合并等功能。
bytes