我的目的是從特定的層中刪除一個元素,並且代碼是一樣的東西:爲什麼無法通過函數調用修改切片的長度或容量?
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
據我所知,切片將被傳遞到一個函數調用作爲引用類型,爲什麼它不能修改它?
切片是**不是**引用類型,不是真的。 –
此外,可能的重複:[Golang追加一個項目到一個切片](https://stackoverflow.com/questions/20195296/golang-append-an-item-to-a-slice)。 –
一個切片不是一個引用類型,雖然[它確實使用了一個指針(或者在功能上等同的東西)來避免浪費內存](https://play.golang.org/p/8CBxmyBJjl)。這意味着內存在兩個切片之間共享,但長度甚至大小可能不同。他們基本上是兩個不同的項目。您可以在Go博客條目「Go Slices:usage and internals」中瞭解更多關於切片的內容,特別是[本節](https://blog.golang.org/go-slices-usage-and-internals#TOC_4。)。 –