The way go to go 第八章总结
之前一章总结了数组和切片。但是没有深度思考,就比如说为什么Go中数组被设计成值而不是设计成引用?像这样的问题。
思考了一下,array固定长度,一旦被初始化分配好了,就固定占用那么多内存空间,是连续的,不能缩短或者加长。
但是slice不一样,他实现了动态伸缩数组的需求。
可以这样说,array用于底层设计,我们平时使用就使用slice就可以了(同时Go语言也一直按时“不要使用array”)
Map
概念
申明,初始化和make
- map是引用类型 内存用make方法来分配
- 与线性查找和切片 读取数据的时候 要考虑一下性能问题
- 永远不要用new,这个相当于分配了一个引用对象,会获得一个空引用的指针,相当于申明了一个未初始化的变量并且取了它的地址。
- map会在内存不够的时候,快速扩张,性能很受影响
总结(new和make的区别)*
Go中的new和make都是用来分配空间的
new:最主要的一点事,它仅仅是是分配空间。输入一个类型, 返回值是指向新分配的零值的指针。
make:为slice或者map或者chan 分配并且初始化。输入时类型和长度,返回值是一个类型
测试键值对是否存在及删除元素
监测是否存在的时候,注意可以返回两个值,其中一个是用来监测是否存在的。
for-range的配套用法
只需要注意map不是按照key的顺序排列的,也不是按照value的顺序排列的。
map类型的切片
- 注意需要使用两次make()函数,第一次分配切片,第二次分配切片中的每个map元素。
- 注意range循环中,哪项是copy值的(也就是不能修改值的) range的那个!
map的排序
map是没有次序的,所以想要排序只能把key或者value拷贝到一个切片上,再对切片排序。
将map的键值对调