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
}
go
本作品采用《CC 协议》,转载必须注明作者和本文链接
一切皆自学
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!