在Go语言中,数组作为函数的参数仍然是值传递,虽然可以使用数组的指针来代替,但是改变不了数组长度。这时,我们通常使用切片slice来替代数组。
6 数组比较
如果数组元素的类型是可比较的,那么这个数组也是可的比较。只有数组的所有元素都相等数组才是相等的。由于长度也是数组类型的一部分,所以长度不同的数组是不等的。
数组可遍历、可修改,是否可比较,由数组元素决定。%T用于显示一个值对应的数据类型。
4.2 数组切片(slice)
数组的长度在定义之后无法修改。数组是值类型,每次传递都将产生一份副本。显然这无法满足开发者的某些需求。Go语言提供了数组切片(slice)来弥补数组的不足。数组和slice之间有着紧密的联系,一个slice是一个轻量级的数据结构,提供了访问数组子序列元素的功能,而且slice的底层确实引用一个数组对象。
1 声明数组切片(slice)
数组切片与数组声明非常相似,唯一区别是无需指定长度。
var 数组切片 []类型
var slice []int
2 基于数组以及基于切片创建切片
arr := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //数组
slice1 := arr[0:5] //基于数组切片1,左闭右开
slice2 := slice1[1:3] //基于切片1创建切片2
fmt.Println(slice1) //[1 2 3 4 5]
fmt.Println(slice2) //[2 3]
3 直接创建切片
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}