go中陣列,切片和append的玄學

夜幕下的風之發表於2021-02-25
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 協議》,轉載必須註明作者和本文連結
一切皆自學

相關文章