The way go to go第七章总结
数组与切片
- 针对容器
- 切片是建立在Go语言数组类型之上的抽象
声明和初始化
- 数组长度最大是2Gb
- Go中数组是一种值类型,换句话说当数组作为参数传递给函数的时候,会发生拷贝现象(与C不同的地方),想要修改的话,利用&,或者生成数组切片。
- 可以取任意数组常量的地址来作为指向新实例的指针
切片
- 切片是一个长度可变的数组
- 切片是引用(类似于C中的数组类型,java中的数组同样属于引用)
- 注意new和make之间的区别:
new函数分配内存;返回指针,获取内存地址。
make函数初始化;返回初始值 - slice、map以及channel都是golang内建的一种引用类型,三者在内存中存在多个组成部分, 需要对内存组成部分初始化后才能使用,而make就是对三者进行初始化的一种操作方式
For-range结构
- for-range循环不能修改值(因为只是一个拷贝),注意为什么多维那个可以修改,分清range的是那个值!
切片重组
切片可以反复扩展直到占据整个相关数组,也可以重新分片。
切片的复制和追加
- 注意一点就是,容量不足以储存新增元素了,会分配一个新的切片来保证这一点,但是返回的切片可能已经指向一个不相同的相关数组了。所以append永远都是成功的,除非内存耗尽。
字符串,数组和切片的应用
- Go中字符串是不可以改变的,要转成字节数组,然后再通过修改,之后转成字符串格式。
- 字符串是一个双字结构,有指针,但是可以看成一个值类型(字符串数组)。但是涉及修改就不能看成值类型。
- 切片的垃圾回收:切片大小可能会远远小于数组,但是底层的数组回收是要求没有任何切片指向它。