数组长度不可变
切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。(注意:切片传递的是指针的拷贝值,所以可以在函数里面修改指针指向的值,对外有影响)
切片的底层内存也是在连续块中分配的,所以切片还能获得索引,迭代以及为垃圾回收优化的好处
slice的结构体包含三个参数,指针,长度,容量
所以传递一个切片切片需要24字节的内存:指针字段需要8字节,长度和容量字段分别需要8字节
类型 | 长度 | 引用 | 扩容 | 优 | 劣 |
---|---|---|---|---|---|
array | 固定长度 | 参数传递时直接copy一份 | 不支持 | 不会影响其他的数据 | 消耗内存 |
slice | 长度不固定 | 在原有的array上修改,相关的都会受到影响 | 容量小于1024则*2,大于1024 *1.25 | 节省内存 | 容易操作失误,出现莫名的问题 |
空切片和 nil 切片的区别在于,
空切片指向的地址不是nil,指向的是一个内存地址,但是它没有分配任何内存空间,即底层元素包含0个元素。
nil 切片被用在很多标准库和内置函数中,描述一个不存在的切片的时候,就需要用到 nil 切片。比如函数在发生异常的时候,返回的切片就是 nil 切片。nil 切片的指针指向 nil。
https://blog.csdn.net/hello_bravo_/article/details/103772016
https://www.jianshu.com/p/030aba2bff41
https://www.jianshu.com/p/030aba2bff41