go中数组,切片和append的玄学
func main() {
arr := make([]int, 0, 9) //长度0,容量9
fmt.Printf("地址0: %p\n", arr) //地址不变
fmt.Printf("len: %d, cap: %d, data:%+v \n", len(arr), cap(arr), arr) //长度0
arr = append(arr, 1, 2, 3) //地址不变,底层数组不变
fmt.Printf("len: %d, cap: %d, data:%+v \n", len(arr), cap(arr), arr) //长度3
add(arr) //append新增
fmt.Println(arr)
fmt.Printf("地址2: %p\n", arr) //地址不变,底层数组不变
//长度3,长度不变,值不变:1,2,3.底层数组值变
fmt.Printf("len: %d, cap: %d, data:%+v \n", len(arr), cap(arr), arr)
}
func add(arr []int) {
//append仅仅改了参数的len长度,不会改变原始值的len长度,但是底层数组值会变,地址不变
//但是修改原始数据为arr[1] = 10 ,arr[2] = 11),可以改变原始切片,切片是引用类型
//另外还要注意,cap容量不足时的自动扩容后,底层数组的改变
arr = append(arr, 10, 11)
fmt.Printf("地址1: %p\n", arr) //地址不变,底层数组不变
fmt.Printf("len: %d, cap: %d, data:%+v \n", len(arr), cap(arr), arr) //长度5,值:1,2,3,10,11
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: