理解 Go 語言中 slice 的性質對于編程非常有益。下面,我將通過代碼示例來解釋切片在不同函數之間傳遞并執行 append 操作時的具體表現。
本篇為第 2 篇,當切片的容量 cap 不夠時
func main() {// slice1 當前長度為 3,容量大小也為 3slice1 := make([]int, 3, 3)fmt.Println("slice 1:", slice1, len(slice1), cap(slice1))test1(slice1)fmt.Println("slice 1:", slice1, len(slice1), cap(slice1))
}func test1(slice2 []int) {slice2[0] = 1slice2 = append(slice2, 1) // append 操作slice2[0] = 2fmt.Println("slice 2:", slice2, len(slice2), cap(slice2))
}
輸出:
slice 1: [0 0 0] 3 3
slice 2: [2 0 0 1] 4 6
slice 1: [1 0 0] 3 3
解釋:在 test1
函數中,我們首先將 slice2
的第一個元素設為 1(這個更改也反映在 slice1
上),然后對其執行 append
操作。
因為 slice2
的容量已滿(3/3),所以 append
操作會觸發底層數組的擴容。
當新的底層數組準備好之后,我們再次更改 slice2
的第一個元素,將其設為 2。這次的更改并不影響 slice1
,因為擴容操作已使 slice2
指向新的底層數組。
示意圖如下: