Go slice
slice的结构:
type slice struct {
array unsafe.Pointer
len int
cap int
}
- array 属性指向一个数组, 占用8个字节,Go中数组是固定长度的
- len 属性则是当前slice的元素数量,占用8个字节
- cap 属性是cap的容量,占用8个字节,也就是当前这个切片最大可容纳的元素数量
slice的初始化:
var a []int
使用 `var` 关键字直接申明
a := []int{1,2,3}
使用字面量直接`:=`
a := make([]int, 1)
使用make
a := b[1:2]
从其他切片中截取
slice的浅拷贝与深拷贝:
- 浅拷贝就是只拷贝当前数据的地址,新旧对象指向同一个内存地址
- 深拷贝就是拷贝数据本身,完全复制一份,新旧对象不共享内存
将slice对象赋给另一个slice,默认是浅拷贝,以下两种方式可以实现slice的深拷贝:
- copy
- 遍历元素然后append
slice的扩容发生在append增加元素的时候,有3种机制:
- 当append之后的cap > 原来的cap的2倍,则新cap直接是append之后的cap
- 当append之后的cap 不大于 原来的cap的2倍,但是>1024时,将原来的cap按1.25倍扩大,直到新的cap > 原来cap
- 当append之后的cap 不大于 原来的cap的2倍,且不大于1024时,新的cap为原先cap的2倍
slice是否线程安全的?答案:不是。为什么呢?
因为slice结构未使用锁机制,在多线程并发读写的时候,结果可能是不符合预期的