最好的網(wǎng)站制作公司百度快照是怎么做上去的
理解 Go 語言中 slice 的性質(zhì)對于編程非常有益。下面,我將通過代碼示例來解釋切片在不同函數(shù)之間傳遞并執(zhí)行 append 操作時的具體表現(xiàn)。
本篇為第 2 篇,當(dāng)切片的容量 cap 不夠時
func main() {// slice1 當(dāng)前長度為 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
函數(shù)中,我們首先將 slice2
的第一個元素設(shè)為 1(這個更改也反映在 slice1
上),然后對其執(zhí)行 append
操作。
因為 slice2
的容量已滿(3/3),所以 append
操作會觸發(fā)底層數(shù)組的擴容。
當(dāng)新的底層數(shù)組準備好之后,我們再次更改 slice2
的第一個元素,將其設(shè)為 2。這次的更改并不影響 slice1
,因為擴容操作已使 slice2
指向新的底層數(shù)組。
示意圖如下: