概念
在golang中,数组和切片是两个概念
数组
数组是一个由固定长度的特定类型元素组成的序列,一个数组能够由零个或多个元素组成。
能够应用len()函数获取数组的长度
切片
因为数组的长度是固定的,因而在Go语言中很少间接应用数组。和数组对应的类型是Slice(切片),它是能够增长和膨胀的动静序列,slice性能也更灵便。
除了长度,切片多了容量属性,能够通过应用内置的 len()函数求长度,应用内置的cap()函数求容量。
雷同
都能够间接通过下标的形式拜访元素
区别
初始化
数组
a := [3]int{1,2,3} //指定长度//ora := [...]int{1,2,3} //不指定长度//ora := [...]int{99: -1}//指定初始化,只有最初一个元素初始化为-1,其余为0
数组能够拓展到多维数组
// 申明一个二维整型数组,两个维度的长度别离是 4 和 2var array [4][2]int// 应用数组字面量来申明并初始化一个二维整型数组array = [4][2]int{{10, 11}, {20, 21}, {30, 31}, {40, 41}}// 申明并初始化数组中索引为 1 和 3 的元素array = [4][2]int{1: {20, 21}, 3: {40, 41}}// 申明并初始化数组中指定的元素array = [4][2]int{1: {0: 20}, 3: {1: 41}}
切片
s := make([]int) //创立一个长度为0,容量为0的切片s := make([]int, 3, 5)//指定长度和容量//ors := []int{1,2,3} //不指定长度
切片同样能够拓展到多维切片
//申明一个二维切片var slice [][]int//为二维切片赋值slice = [][]int{{10}, {100, 200}}
增加元素
尽管数组在初始化时也能够不指定长度,但 Go 语言会依据数组中元素个数主动设置数组长度,并且不可扭转。
切片更像是一个动静的数组,能够通过 append 办法减少元素:
s := []int{1,2,3} //s = {1,2,3}s = append(s, 4) //s = {1,2,3,4}//增加多个元素s = append(s, 1, 2, 3) // 追加多个元素, 手写解包形式s = append(s, []int{1,2,3}...) // 追加一个切片, 切片须要解包
如果将 append 用在数组上,你将会收到报错:first argument to append must be slice。
复制
数组
在Go语言中,数组变量代表的是整个数组
所以在Go语言中,当数组变量B被赋值数组变量A时,实际上是数组变量B齐全复制了一份数组A数据,而不是数组变量A和数组变量B指向同一份数据。
切片
Go语言的内置函数 copy() 能够将一个数组切片复制到另一个数组切片中,如果退出的两个数组切片不一样大,就会依照其中较小的那个数组切片的元素个数进行复制。
copy(slice2, slice1) // 复制slice1到slice2中
其中slice2, slice1指向同一个数组
详见https://segmentfault.com/a/11...
函数传递
当切片和数组作为参数在函数(func)中传递时,数组传递的是值,而切片传递的是指针。因而当传入的切片在函数中被扭转时,函数外的切片也会同时扭转。雷同的状况,函数外的数组则不会产生任何变动。