packagemain
import"fmt"
funcmain() {
slic := []int{1, 2, 3}
// len(cp) = 3, cap(cp) = 3
cp := make([]*int, len(slic))
fori, x := rangeslic {
cp[i] = &slic[i]
cp = append(cp, &x)
}
// 第一次循环
// cp[0] = &slic[0] *cp[0] = 1
// 由于len=cap=3,append方法的作用是将元素追加到切片的末尾,即cp(len)位置,此时append便超过切片容量,切片进行扩容,将容量扩容2倍(切片容器<1024时,扩容*2)。
// append后相当于 cp[3] = &x 此时x的值为1,len(cp)=4, cap(cp)=6
// 第二次循环
// cp[1] = &slic[1] *cp[1] = 2
// 再次append相当于 cp[4] = &x 此时x的值为2,len(cp)=5, cap(cp)=6
// 第三次循环
// cp[2] = &slic[2] *cp[2] = 3
// 再次append相当于 cp[5] = &x 此时x的值为3,len(cp)=6, cap(cp)=6
// 至此循环完毕,cp中数据为 &slic[0] &slic[1] &slic[2] &x &x &x
println("len==", len(cp), " cap==", cap(cp))
for_, x := rangecp {
fmt.Print(*x, " ")
}
}
/* 输出结果
len== 6 cap== 6
1 2 3 3 3 3
*/