golang copy函数用于在两个slice之间进行拷贝数据,其拷贝数据的长度为 len(dst)与len(src)之间的最小值,所以以下拷贝的长度为 0 字节:
var bd = make([]byte,100)[:0]
func main() {
//bd = bd[:len(bd) + 10]
copy(bd,[]byte{1,2,3})
fmt.Println(bd)
}
因为 len(bd)等于0
要拷贝成功,必须将代码中的注释打开,使 len(bd)不等于0
所以我们看源码中 buffer.go(src\bytes\buffer.go)的Write* 系列函数,在调用copy之前都会调用一次
tryGrowByReslice函数,tryGrowByReslice函数定义如下:
func (b *Buffer) tryGrowByReslice(n int) (int, bool) {
if l := len(b.buf); n <= cap(b.buf)-l {
b.buf = b.buf[:l+n]
return l, true
}
return 0, false
}
其作用也是在增大 slice 的 len域。