read.md 2.1 KB

数组和切片

不同点

  1. 数组类型长度是固定的,切片是可变长的
  2. 组的长度在声明它的时候就必须给定,并且之后不会再改变。可以说,数组的长度是其类型的一部分。比如,[1]string和[2]string就是两个不同的数组类型。
  3. 切片的长度可以自动地随着其中元素数量的增长而增长,但不会随着元素数量的减少而减小
  4. 值字面量的区别img

有关值类型和值传递

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