go语言学习二- 数组、切片、映射

2020-07-09 00:00:00 函数 数组 底层 容量 切片
  • 数组
    • 数组的内存布局是连续的。
    • 复制指针数组,智慧复制指针的值,而不会复制指针所指向的值
    • 函数之间传递变量总是以值的方式传递的,因此函数兼传递数组是一个开销很大的操作。可以通过传递指向数组的指针来进行数组的传递
  • 切片
    • 切片是围绕动态数组的概念构建的,可以按需自动增长和缩小
    • 切片底层内存在连续块中分配,因此能获得索引、迭代以及垃圾回收优化的好处。
    • 切片的数据结构
      • 指向底层数组的指针
      • 切片长度
      • 切片容量
    • 切片初始化
      • slice := make([]string,5),只指定切片长度,容量=长度
      • slice := make([]string,3,5),分别指定长度和容量
      • slice := []string{"red","blue","green","yellow","pink"}
      • 切片的容量>=长度
    • 数组和切片的声明区别
      • arr := [3]int{1,2,3}
      • arr := []int{1,2,3}
    • 切片增长
      • append()函数,返回一个新的切片
    • 截取新切片
      • slice := []int{1,2,3,4,5,6,7}

slice2 := slice[i,j]

i为从slice截取切片的起始下标,j为结束下标,包头不包尾

slice2的长度为(j-i),slice2的容量为(slice的容量-i)

  • slice := slice[i,j,k]

长度:j - i

容量:k- i

  • Append()
    • 新切片使用append()函数增长时,也影响源切片的数据(新切片和源切片共享底层数组),当增长超过源切片时,append()函数会创建一个新的底层数组来承载增长后的切片,将现有的值复制到新数组里,再追加新值,此时append()返回的切片的容量为源切片的两倍。
    • Append()函数会智能的处理底层数组的容量增长,切片容量小于1000时,每次成倍增长,超过1000后,增长因子改为1.25
    • 为了防止新切片append数据时污染源切片底层数组中的数据,可增加第三个索引控制新切片的容量,次append时就创建新的底层数组。
    • Append()函数可以使用"…"运算符将一个切片的所有元素追加到另一个切片里

Append(slice,slice2…)

  • 迭代切片
    • for index,value := range slice{}
    • 迭代返回的value是迭代过程中根据切片中当前元素值依次赋值的新变量,所以value的地址总是相同的,若想获取每个元素的地址,可以使用切片变量和索引值&slice[index]
    • 内置函数len()返回切片的长度,cap()返回切片的容量

相关文章