Go array和slice的区别?

1)数组长度不同

数组初始化必须指定长度,并且长度就是固定的

切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大

2)函数传参不同

数组是值类型,将一个数组赋值给另一个数组时,传递的是一份深拷贝,函数传参操作都会复制整个数组数据,会占用额外的内存,函数内对数组元素值的修改,不会修改原数组内容。

切片是引用类型,将一个切片赋值给另一个切片时,传递的是一份浅拷贝,函数传参操作不会拷贝整个切片,只会复制len和cap,底层共用同一个数组,不会占用额外的内存,函数内对数组元素值的修改,会修改原数组内容。

3)计算数组长度方式不同

数组需要遍历计算数组长度,时间复杂度为O(n)

切片底层包含len字段,可以通过len()计算切片长度,时间复杂度为O(1)