我们知道,如果我们在给一个切片append元素的时候,如果这个切片的容量(Cap)不够的时候,切片会自动进行扩容(这个扩容过程是通过拷贝实现的),但是如果我们想要在一个切片容量足够的时候对其进行扩容呢?那么可以通过以下代码进行实现,实现的原理也是拷贝:
func main() {
buf := make([]int, 0, 20)
buf = append(buf, 1,2,3,4,5,6,7,8,9,10)
fmt.Printf("addr:%p\n",buf);
fmt.Println(buf)
fmt.Println(len(buf))
fmt.Println(cap(buf))
fmt.Println("________________________")
c := cap(buf)
l := len(buf)
newbuf := make([]int, l, 2*c)
copy(newbuf, buf[:]) //Copy时要保证切片有足够的大小(长度),而不是容量
buf = newbuf
fmt.Printf("addr:%p\n",buf);
fmt.Println(newbuf)
fmt.Println(len(newbuf))
fmt.Println(cap(newbuf))
fmt.Println("________________________")
fmt.Printf("addr:%p\n",buf);
fmt.Println(buf)
fmt.Println(len(buf))
fmt.Println(cap(buf))
}
输出
addr:0xc00008e000
[1 2 3 4 5 6 7 8 9 10]
10
20
________________________
addr:0xc000094000
[1 2 3 4 5 6 7 8 9 10]
10
40
________________________
addr:0xc000094000
[1 2 3 4 5 6 7 8 9 10]
10
40