一、数组
基本概念
1、一组相同类型已编号且长度固定的数据项序列
声明格式:var identifier [len]type
2、Go语言中数组是一种值类型,不是c中指向首元素地址,函数中使用 数组作为参数,是值传递,会产生一次数组拷贝。不会修改原数据
3、将数组传递给函数,有两种方法1)传递数组的指针;2)使用数组的切片
二、切片
基本概念:
1、切片是对数组一个连续片段的引用,所以切片是一个引用类型。类似c/c++中的数组概念,python的list类型。
2、切片的长度可以再运行时修改。最小为0,最大为数据长度。切片是一个长度可变的数组。计算容量cap(s).就是从s[0]到数组末尾的数组长度。
3、多个切片如果表示同一个数组的片段,它们可以共享数据。
4、声明切片的格式:var identifier []type(不需要说明长度)。
初始化:var slice1 []type = arr1[start:end]
将切片传递给函数:
5、用make()创建一个切片:var slice1 []type = make([]type, len) 或者:slice1 := make([]type, len)
New()和make()的区别:new函数分配内存,make函数初始化。
三、切片和数组的区别:
1、数组是需要指定个数的,而切片则不需要。数组赋值也可是使用如下方式,忽略元素个数,使用“...”代替
2、slice和array的关系十分密切,通过两者的合理构建,既能实现动态灵活的线性结构,也能提供访问元素的高效性能。当然,这种结构也不是完美无暇,共用底层数组,在部分修改操作的时候,可能带来副作用,同时如果一个很大的数组,那怕只有一个元素被切片应用,那么剩下的数组都不会被垃圾回收,这往往也会带来额外的问题。
3、使用make创建slice,此时golang会生成一个匿名的数组。
4、append操作超过了原始切片的容量,将会有一个新建底层数组的过程,那么此时再修改函数返回切片,应该不会再影响原始切片。