問題描述:
考慮以下Go 程式碼:
func main() { slice := make([]int, 10, 10) slice[0] = 0 slice[1] = 1 slice1 := slice slice1[0] = 10000 fmt.Println(slice) slice1 = append(slice1, 100) slice1[0] = 20000 fmt.Println(slice) }
考慮以下Go 程式碼:
初始輸出符合預期:slice 和slice1 顯示相同的值。然而,在對slice1進行追加操作後,slice的值保持不變。假設切片是指針,這種行為似乎違反直覺。解釋:
append 函數不會修改 slice1。 Go 會以值傳遞所有值,因此 slice1 接收 slice 的副本。由於原始數組已達到其容量,追加操作會建立一個新數組。然後,它將舊數組的內容複製到新數組中,並傳回指向新數組的新切片頭。 將回傳值指派給 slice1 會改變 slice1。但是,切片不受影響,因為它是指向原始數組的單獨變數。因此,append操作後對slice1或slice的元素所做的任何更改都不會反映在另一個中。 綜上所述,Go中的切片是按值傳遞的,append透過new建立新的切片必要時底層數組。這意味著對一個切片所做的更改不會反映在指向原始數組的其他切片中。以上是為什麼附加到 Go 切片不會影響指向同一底層數組的其他切片?的詳細內容。更多資訊請關注PHP中文網其他相關文章!