GO语言补充(二)

切片Slice

其本身并不是数组,它指向底层的数组
作为变长数组的替代方案,可以关联底层数组的局部或全部
为引用类型
可以直接创建或从底层数组获取生成
使用len()获取元素个数,cap()获取容量
一般使用make()创建
如果多个slice指向相同底层数组,其中一个的值改变会影响全部

make([]T, len, cap)
其中cap可以省略,则和len的值相同
len表示存数的元素个数,cap表示容量

注意:“[]”中既没有数字,也没有“…”,则表示声明的是一个slice,切片类型。

这里,讲到切片的范围,又要注意外国人的脑回沟一般是“左闭右开”的。就是“[ … )”的样子。

Slice与底层数组的对应关系

注意,切片包含的是len,长度和cap,容量。
长度,就是声明的范围,容量就是从开始处到末尾为止的元素个数。

Reslice

Reslice时索引以被slice的切片为准
索引不可以超过被slice的切片的容量cap()值
索引越界不会导致底层数组的重新分配而是引发错误

取已知切片的内容时,取得是切片的相对位置。

Append

可以在slice尾部追加元素
可以将一个slice追加在另一个slice尾部
如果最终长度未超过追加到slice的容量则返回原始slice
如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据

这里,就开始很神奇的事情了。



进行比较:
超过容量,重新分配内存,而不是原来数据的引用。


Copy


map

类似其它语言中的哈希表或者字典,以key-value形式存储数据
Key必须是支持==或!=比较运算的类型,不可以是函数、map或slice
Map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍
Map使用make()创建,支持 := 这种简写方式

make([keyType]valueType, cap),cap表示容量,可省略
超出容量时会自动扩容,但尽量提供一个合理的初始值
使用len()获取元素个数

键值对不存在时自动添加,使用delete()删除某键值对
使用 for range 对map和slice进行迭代操作

简单map的操作


复杂map的操作:

总结,多层map的时候,一定要注意每一层都成功初始化了之后再使用。

迭代操作:

在遍历slice的时候,有i,v可以分别获得元素的下标和元素值的拷贝。如果不需要的时候可以用“_”代替掉;
在遍历map的时候,有k,v可以分别获得map中的key值和元素值的value的拷贝。如果不需要的时候可以用“_”代替掉。

注意,GO语言中的map和C++中的map不一样,他是无序的。