切片和数组的定义和初始化
数组是一个由固定长度、特定类型元素组成的序列,一个数组可以由零个或多个元素组成。每个元素可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置。内置的len函数将返回数组中元素的个数。
切片代表可变长的序列,序列中每个元素都有相同的类型。一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已。
因此这里需要注意的是:在初始化一个数组的时候,需要指定该数组的长度,而初始化一个切片的时候不需要指定其长度。
声明并初始化一个数组
var a [5]int = [5]int{1,2,3,4,5}
声明并初始化一个切片
var a []int = []int{1,2,3,4,5} // 或者 a := make([]int)
它们两个较为相似,在实际运用的过程中需多加注意。
在使用数组的时候,传递数组的形式是值传递,而使用切片进行传递的则是引用传递,在go的for range 循环取值的过程中,数组和切片的使用会导致不同结果。
数组:
var a1 [5]int = [5]int{1, 2, 3, 4, 5}
b1 := a1
for k, _ := range b1 {
b1[k] = k
}
fmt.Println(a1) //[1,2,3,4,5]
fmt.Println(b1) //[0,1,2,3,4]
切片:
var a2 []int = []int{1, 2, 3, 4, 5}
b2 := a2
for k, _ := range b2 {
b2[k] = k
}
fmt.Println(a2) //[0,1,2,3,4]
fmt.Println(b2) //[0,1,2,3,4]
数组b1的初始化是a1复制了一份给了b1,而切片b2的初始化则是让b2指向了a2的那一份,于此同时,for range中参与的数组实际上是b1的副本,因此在经历循环赋值之后,a1数组没有改变,而a2切片发生了改变。