Go语言当中数组和切片的区别是什么?
Go语言当中数组和切片的区别是什么?
Go语言中的数组:
数组固定长度。数组长度是数组类型的一部分,所以[3]int 和[4]int 是两种不 同的数组类型数组需要指定大小,不指定也会根据初始化, 自动推算出大小, 大小不可改变。数组是通过值传递的
Go语言中的切片:
切片可以改变长度。切片是轻量级的数据结构,三个属性,指针,长度,容量 不需要指定大小切片是地址传递(引用传递)可以通过数组来初始化,也可以 通过内置函数 make()来初始化,初始化的时候 len=cap,然后进行扩容。
1 回复
在Go语言中,数组(Array)和切片(Slice)是两种用于存储相同类型元素的集合,但它们之间存在几个关键的区别。
数组(Array)
- 数组具有固定的长度,一旦创建,其长度不能改变。
- 数组在Go中是值类型,这意味着当数组作为参数传递给函数时,传递的是数组的副本。
- 数组可以通过索引访问其元素,索引从0开始。
示例代码:
package main
import "fmt"
func main() {
var arr [5]int // 声明一个长度为5的整型数组
arr[0] = 1 // 初始化第一个元素
fmt.Println(arr) // 输出: [1 0 0 0 0]
}
切片(Slice)
- 切片是对数组的抽象,提供了一种灵活的方式来处理数组中的元素序列。
- 切片的长度是可变的,可以通过内置函数
append
增加切片的长度。 - 切片是引用类型,这意味着当切片作为参数传递给函数时,传递的是对原始数组的引用,而不是数组的副本。
- 切片可以重新切片,这意味着可以创建共享相同底层数组的新的切片实例。
示例代码:
package main
import "fmt"
func main() {
arr := [5]int{1, 2, 3, 4, 5} // 声明并初始化一个数组
slice := arr[1:4] // 从数组arr中创建一个切片slice,包含索引1到3的元素
fmt.Println(slice) // 输出: [2 3 4]
slice = append(slice, 6) // 向切片追加一个元素
fmt.Println(slice) // 输出: [2 3 4 6]
// 注意:原始数组arr不会被append操作改变
fmt.Println(arr) // 输出: [1 2 3 4 5]
}
总结
- 长度:数组长度固定,切片长度可变。
- 类型:数组是值类型,切片是引用类型。
- 内存分配:数组在声明时分配内存,切片根据需要动态分配内存。
- 操作:切片提供了更灵活的操作,如追加元素、重新切片等,而数组则较为固定。