go语言学习二- 数组、切片、映射
- 数组
- 数组的内存布局是连续的。
- 复制指针数组,智慧复制指针的值,而不会复制指针所指向的值
- 函数之间传递变量总是以值的方式传递的,因此函数兼传递数组是一个开销很大的操作。可以通过传递指向数组的指针来进行数组的传递
- 切片
- 切片是围绕动态数组的概念构建的,可以按需自动增长和缩小
- 切片底层内存在连续块中分配,因此能获得索引、迭代以及垃圾回收优化的好处。
- 切片的数据结构
- 指向底层数组的指针
- 切片长度
- 切片容量
- 切片初始化
- 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()返回切片的容量
相关文章