# 数组和切片 ## 不同点 1. 数组类型长度是固定的,切片是可变长的 2. 组的长度在声明它的时候就必须给定,并且之后不会再改变。可以说,数组的长度是其类型的一部分。比如,[1]string和[2]string就是两个不同的数组类型。 3. 切片的长度可以自动地随着其中元素数量的增长而增长,但不会随着元素数量的减少而减小 4. 值字面量的区别![img](read.assets/edb5acaf595673e083cdcf1ea7bb966c.png) ## 有关值类型和值传递 1. 值类型和值传递,不是同一个说法 2. golang只有值传递,即使传递的是指针类型,如切片、map、通道,也是创建新的指针副本,指针存储地址相同,其指向不同。 3. 数组是值类型,其创建的副本是在新的内存地址中copy一个完全相同的值类型,这里是数组,所做修改均在新内存空间中。 4. 而切片是引用类型,其创建的副本是在新的内存地址中copy一个完全引用类型,这里是指针,所做的修改均在新内存空间中,也就是新指针副本中,但新的指针副本,虽然所在内存地址不同,但其指向的内存空间和原指针是一样的。https://www.flysnow.org/2018/02/24/golang-function-parameters-passed-by-value.html 5. 这里也要记住,引用类型和传引用是两个概念。 6. 再记住,Go里只有传值(值传递)。 ## 有关len()和cap() 1. https://www.cnblogs.com/sunshineliulu/p/12244532.html 2. 创建切片的时候,如果没特殊说明,cap容量=len长度 3. cap是指底层数组的长度,len是指当前切片的长度,当前切片取自底层数组 4. 当前切片扩容时,即append,如果无需对底层数组扩容,则切片的容量和指针地址不会变,但底层数组会变 5. 如果需要对底层数组扩容,则容量和指针地址会改变,会生成一个新的底层数组,但是它也同时生成了新的切片。它只是把新的切片作为了新底层数组的窗口,而没有对原切片,及其底层数组做任何改动。