go语言中array与slice的区别总结

数组array 切片slice 区别
声明定义
var arrayName [arrayLength] dataType
var sliceName [] dataType 声明数组需要长度信息,定义slice时不需要
初始化 var arrayName = [arrayLength] dataType {Val1, … Valn}

var arrayName = […] dataType {Val1, … Valn}
var sliceName = [] dataType {Val1, … Valn}

var slice [] type = make([] type, length)

通过数组初始化:
slice := array[:]
slice := array[startIndex:endIndex]
初始化数组时需要长度信息,初始化slice时不需要
取值 通过索引index取相应的元素值:
arrayName[index]
通过index取元素值:
slice[index]

返回一个新切片值:
slice[startIndex:endIndex]
slice取值除了可以获取一个元素的值外,还可以获取一个新的切片
赋值 元素赋值:
array[index] = value

数组赋值:
var new_array = array
new_array := array
元素赋值:
slice[index] = value

将单个单个值append()到slice中,返回的新slice长度会增加:
slice = append(slice, v1, v2…)

将一个slice copy()到另一个slice中,目标slice长度不变,最多copy截止到目标元素最后一个元素:
copy(slice1, slice2)
copy(slice1[si:], slice2)
数组支持简单的单元素或者整体赋值,slice则支持更加精细度的赋值
扩展 不支持 append(),新的slice length和capacity均发生变化:

var slice = []int {1, 2, 3, 4, 5}
slice = append(slice, 1, 2)
fmt.Printf(“length: %d, capacity: %d\n”, len(slice), cap(slice))

length: 7, capacity: 10
slice支持扩展,扩展后的新slice长度为新元素的个数,capacity是原capacity的2的指数倍
函数传参 值传递,被传递的array所有的值copy給形式参数,函数内对数组的改变不会传播给传入的数组 引用传递,函数内对slice的改变会反应到传入的参数中 数组是值传递,所以直接传递数组代价很高,使用slice相应代价会降低。因此go的标准库中多以slice实现
判断长度 len() len() 相同