切片
相当于是C语言中的动态数组,但在Go的语法下变得简洁清晰。而切片这个定义也可以理解为切出一片空间使用
func main() {
x := make([]int, 0, 5)//创建一个长度为0,容量为5的切片
//[]int 是动态数组类型,也可以开辟其他集合类型的空间,如通道,map
for i := 0; i < 8; i++ {
x = append(x, i)
//在切片的最后位置追加数据,当超出容量的时候,容量会自动翻倍。如此时追加的数据超过5个变为8个,容量翻倍为10
//出于安全考虑,当新的空间开辟以后,新的空间地址可能与x的空间不同,要捕获到并赋给x
}
fmt.Println(x, len(x), cap(x))//len()测量有效元素的个数
//cap()测量容量大小,二者都是go的内置函数
}
输出:[0 1 2 3 4 5 6 7] 8 10
切片和数组
在数组中切片是指向数组的子集,切片改变,相应的数组元素也会改变
func main() {
x := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
s := x[2:5]
//创建切片,指向数组的2-4号元素[2,5),切片容量长度为从2号开始到最后一号元素的的长度,即len(x)-2
fmt.Println(s)//输出:3 4 5
s[1] += 3// 即x[3]+=3.若令s[8]=9,则越界不合法。
fmt.Println(x[3])//输出:7 (4+3)
fmt.Println(len(s), cap(s), len(x), cap(x))//输出:3 7 9 9
}
其他创建切片的方式
s:=x[:4] 取值范围[0,4)
s:=x[:] 取值范围[0,len(x))
s:=x[5:] 取值范围[5,len(x))
s:=x[3:len(x)] ...