Go中的切片和数组

切片和数组的定义和初始化

数组是一个由固定长度、特定类型元素组成的序列,一个数组可以由零个或多个元素组成。每个元素可以通过索引下标来访问,索引下标的范围是从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切片发生了改变。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容