golang append修改原數組情況

背景

示例代碼

package main

import "fmt"

func main() {
    a := []int{1, 2, 3, 4, 5, 6, 7}
    a2 := append(a[:2], a[3:]...)
    fmt.Println(a2)
    fmt.Println(a)
    fmt.Println(&a2[0] == &a[0])
    a[0] = -1
    fmt.Println(a2)
    fmt.Println(a)
    fmt.Println("-------------")
    b := []int{1, 2, 3, 4}
    b2 := append(b[:2], []int{5, 6, 7, 8, 9, 10}...)
    fmt.Println(b2)
    fmt.Println(b)
    fmt.Println(&b2[0] == &b[0])
    b[0] = -1
    fmt.Println(b2)
    fmt.Println(b)
}

輸出結果:

[1 2 4 5 6 7]
[1 2 4 5 6 7 7]
true
[-1 2 4 5 6 7]
[-1 2 4 5 6 7 7]
-------------
[1 2 5 6 7 8 9 10]
[1 2 3 4]
false
[1 2 5 6 7 8 9 10]
[-1 2 3 4]

解釋

a[0:2]長度為2, a[3:]長度為4,原本的數組a長度為7,不需要擴展生成新數組( api說明

append 內置函數將元素附加到切片的末尾。如果它有足夠的容量,則重新劃分目標以容納新元素。如果沒有,將分配一個新的底層數組。 Append 返回更新後的切片。因此有必要將 append 的結果存儲在保存切片本身的變量中:

所以,就在原來的數組a上面做修改。

而b的情況相反,新數組長度為6,大於b的長度4,擴展了數組,生成新的數組。