文章目录
扩容时大小与容量的变化
切片在扩容时,是按容量的2倍数进行扩容的。
package main
import (
"fmt"
)
func main() {
var numList []int
for i := 0; i < 16; i++ {
numList = append(numList, i)
fmt.Printf("len: %d, cap: %d, pointer: %p\n", len(numList), cap(numList), numList)
}
}
输出(注意地址的变化):
len: 1, cap: 1, pointer: 0xc000064090
len: 2, cap: 2, pointer: 0xc0000640d0
len: 3, cap: 4, pointer: 0xc000062140
len: 4, cap: 4, pointer: 0xc000062140
len: 5, cap: 8, pointer: 0xc00007c0c0
len: 6, cap: 8, pointer: 0xc00007c0c0
len: 7, cap: 8, pointer: 0xc00007c0c0
len: 8, cap: 8, pointer: 0xc00007c0c0
len: 9, cap: 16, pointer: 0xc000094080
len: 10, cap: 16, pointer: 0xc000094080
len: 11, cap: 16, pointer: 0xc000094080
len: 12, cap: 16, pointer: 0xc000094080
len: 13, cap: 16, pointer: 0xc000094080
len: 14, cap: 16, pointer: 0xc000094080
len: 15, cap: 16, pointer: 0xc000094080
len: 16, cap: 16, pointer: 0xc000094080
复制切片
原始切片变化时,引用切片也会变化,而复制切片不会变化。
package main
import (
"fmt"
)
func main() {
const count = 1000
srcData := make([]int, count)
for i := 0; i < count; i++ {
srcData[i] = i
}
refData := srcData
copyData := make([]int, count)
copy(copyData, srcData)
srcData[0] = 999
fmt.Println(refData[0], copyData[0], copyData[count-1])
copy(copyData, srcData[4:6])
fmt.Println(copyData[:5])
}