# 数组和切片

## 不同点

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. 如果需要对底层数组扩容，则容量和指针地址会改变，会生成一个新的底层数组，但是它也同时生成了新的切片。它只是把新的切片作为了新底层数组的窗口，而没有对原切片，及其底层数组做任何改动。

