GO语言中array与slice的比较
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() | 相同 |