- 切片slice的底层是数组。
所以提到切片就会讲到它与数组的区别。
1.在Go中,数组是值类型,而切片是引用类型。
在C中数组是引用类型,因此在Go中传递数组的时候实际上是复制了整个数组,所以想通过传递的数组修改原数组元素是改不了的,因为改到的是副本。而对于切片而言就相反,它不会复制,而是直接在原底层数组操作。
2.在创建时,两者也有明显的区别。数组在创建时必须指定大小,而切片不用,并且切片可以使用make来创建。 - 切片的操作及性能
- 性能陷阱
在已有切片的基础上进行切片,不会创建新的底层数组,使用的都是原来的底层数组,可能我们只用其中一小部分,就会导致原来很多的空间继续被占用。
推荐的做法:copy
- 总结
切片是引用类型,底层是数组。操作切片时都是在其原底层数组进行操作,这很高效,同时也很容易踩坑。如果想操作切片,推荐将要操作的部分copy出来进行操作,以免占用大量中间而释放不了。