2017-10-18 28 views
-1

我的目的是從特定的層中刪除一個元素,並且代碼是一樣的東西:爲什麼無法通過函數調用修改切片的長度或容量?

func main() { 
    s := []int{0, 1, 2, 3, 4} 
    remove(s, 3) 
    fmt.Println(s, len(s), cap(s)) 
} 

func remove(s []int, idx int) { 
    if idx < 0 || idx >= len(s) { 
     return 
    } 
    copy(s[idx:], s[idx+1:]) 
    s = s[:len(s)-1] 
    fmt.Println(s, len(s), cap(s)) 
} 

但輸出顯示:

[0 1 2 4] 4 5 [0 1 2 4 4] 5 5

據我所知,切片將被傳遞到一個函數調用作爲引用類型,爲什麼它不能修改它?

+5

切片是**不是**引用類型,不是真的。 –

+1

此外,可能的重複:[Golang追加一個項目到一個切片](https://stackoverflow.com/questions/20195296/golang-append-an-item-to-a-slice)。 –

+0

一個切片不是一個引用類型,雖然[它確實使用了一個指針(或者在功能上等同的東西)來避免浪費內存](https://play.golang.org/p/8CBxmyBJjl)。這意味着內存在兩個切片之間共享,但長度甚至大小可能不同。他們基本上是兩個不同的項目。您可以在Go博客條目「Go Slices:usage and internals」中瞭解更多關於切片的內容,特別是[本節](https://blog.golang.org/go-slices-usage-and-internals#TOC_4。)。 –

回答

5

切片保持三個值:

1)指針底層數組

2)長度

3)容量

當通過切片於函數時,要傳遞的副本這三種價值中的一種。因此,您無法更改長度和容量,但由於您有指向底層數組的指針,因此可以更改數組內的值。

2

切片不是指針類型。在引擎蓋下片由3個值組成:長度,容量和指向數組的指針。當你通過價值傳遞它時,你會得到長度和容量的副本 - 你可以爲你改變它們。對數組的更改將在該函數外部可見。

如果產生這樣的結果

相關問題