slice的结构:

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}
  • array 属性指向一个数组, 占用8个字节,Go中数组是固定长度的
  • len 属性则是当前slice的元素数量,占用8个字节
  • cap 属性是cap的容量,占用8个字节,也就是当前这个切片最大可容纳的元素数量

slice的初始化:

  1. var a []int

    
    使用 `var` 关键字直接申明
    
  2. a := []int{1,2,3}

    
    使用字面量直接`:=` 
    
  3. a := make([]int, 1)

    
    使用make
    
  4. 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结构未使用锁机制,在多线程并发读写的时候,结果可能是不符合预期的

标签: none

添加新评论