线性数据结构
线性表
是一种抽象的数学概念,是一组元素的序列的抽象,它由有穷个元素组成(0 个或任意个)。包括顺序表和链接表。
顺序表:使用一大块连续的内存顺序存储表中的元素,这样实现的表称为顺序表,或称连续表 在顺序表中,元素的关系使用顺序表的存储顺序自然地表示;
链接表:在存储空间中将分散存储的元素链接起来,这种实现称为链接表,简称链表。
数组 长度不可变、 内容可变、 可索引、 值类型、 顺序表 定义方式var a0 [3]int // 零值初始化3个元素的数组 var a1 = [3]int{} // 零值初始化3个元素的数组 // [3]int是类型,[3]int{} 是字面量值 var a2 [3]int = [3]int{1, 3, 5} // 声明且初始化 var a3 = [3]int{1, 3, 5} // 声明且初始化 const count = 3 a4 := [count]int{1, 3, 5} // 此处的count为常量,变量的话不支持,变量是可变的,数组的声明是需要明确长度的。
// 二维数组 a8 := [2][3]int{{100}} // 两行三列 [[100 0 0] [0 0 0]] // [[10 0 0] [11 12 0] [13 14 15] [16 0 0]] // 多维数组,只有第一维才能用...推测 // 第一维有4个,第二维有3个。可以看做4行3列的表 a9 := [...][3]int{{10}, {11, 12}, {13, 14, 15}, {16}}
思考:三维数组怎么定义?怎么去理解?
长度和容量 cap即capacity,容量,表示给数组分配的内存空间可以容纳多少个元素 len即length,长度,指的是容器中目前有几个元素 由于数组创建时就必须确定的元素个数,且不能改变长度,所以不需要预留多余的内存空间,因此cap 和len对数组来说相等。 索引 Go语言不支持负索引。通过[index]来获取该位置上的值。索引范围就是[0, 长度-1]。
a5 := [...]int{10, 30, 50} a5[0] += 100 // 通过索引来修改值
下面是int类型的数组
下面是string类型数组,对于string类型数组,与int有不同之处,因为string本身长度是可变的,所以不能再像整形那样直接在内存地址中存内容了。
在go中string类型底层其实就是顺序表,对于string类型的数组,不管数组中的元素长度大小,每个元素间隔都是16字节,内存地址中是存储的string的地址,可以理解位二级指针。
值类型
通过下面示例,可以看出,Go语言在这些地方对数组进行了值拷贝,都生成了一份副本