扩容原则:
当slice的数据长度小于容量一半时,不扩容,反之,则容量扩大为原来的2倍

  • 1.如果 L + n < c 时,这时slice不需要扩容,(参考源码 tryGrowByReslice 函数)
    在这里插入图片描述

  • 2.当 L+n >= c 时, (参考源码 grow(n) 函数)需要分两种情况讨论

  • 2.1 如果写入数据之后buffer的长度小于slice容量的一半时 ,也就是m+n < c/2 时,
    此时我们用copy移动一下buffer的数据,再更新读的偏移量即可

在这里插入图片描述

  • 2.2 如果写入数据之后buffer的长度大于等于slice容量的一半时 ,也就是m+n >= c/2 时,此时需要两步
  • 2.2.1.扩大原来slice 的容量
    如果只是简单地将容量由c扩容至2c ,
    此时m+n >= c/2 ,有可能出现m+n >c 的情形,由于m < 2
    c ,则必有m+n < 2c +n ,
    所以我们只要将容量扩容至n+2
    c 即可满足要求
  • 2.2.2 用copy移动一下buffer的数据,再更新读的偏移量即可
    在这里插入图片描述