Go语言中的数组和切片是两种用于存储一系列相同类型元素的数据结构,但它们在使用上有很大的区别。
数组(Array)
数组是一个固定长度的有序集合,一旦定义了数组的大小,它就不能改变。数组的大小是其类型的一部分,因此 [5]int
和 [10]int
是两个不同的类型。数组可以初始化时指定元素:
var arr [5]int // 定义一个包含5个整数的数组
arr = [5]int{
1, 2, 3, 4, 5} // 初始化数组
访问数组元素使用索引,从 0
开始:
fmt.Println(arr[0]) // 打印第一个元素
数组在作为参数传递给函数时,实际上会复制整个数组,这可能会导致较大的性能开销。
切片(Slice)
切片是对底层数组的一个动态窗口,提供了更灵活、功能更强大的接口。切片没有固定的长度,并且可以在运行时增长或缩小。创建切片可以通过多种方式:
使用内置的
make
函数:slice := make([]int, length) // 创建一个指定长度的切片 slice := make([]int, length, capacity) // 指定长度和容量
通过数组来创建:
arr := [5]int{ 1, 2, 3, 4, 5} slice := arr[1:3] // 创建一个引用arr中索引1到3(不包括)的元素的切片
直接声明并初始化:
slice := []int{ 1, 2, 3, 4, 5} // 创建并初始化一个切片
切片在传递给函数时不会被复制,而是传递指向底层数组的引用,这使得操作更加高效。你可以使用内置的 len
函数获取切片的长度,用 cap
获取切片的容量。切片还可以通过 append
函数添加新的元素,如果需要的话,这将会分配一个新的更大的底层数组。
slice = append(slice, 6) // 添加一个新元素
切片是Go中最常用的复合类型之一,因为它们提供了数组的所有功能,同时增加了灵活性和便利性。