Function 为什么无法修改切片';通过函数调用的长度或容量?

Function 为什么无法修改切片';通过函数调用的长度或容量?,function,go,slice,Function,Go,Slice,我的目的是从特定切片中删除一个元素,代码如下: 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

我的目的是从特定切片中删除一个元素,代码如下:

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))
}
func main(){
s:=[]int{0,1,2,3,4}
删除(s,3)
fmt印刷品编号、透镜编号、封顶编号
}
func remove(s[]int,idx int){
如果idx<0 | | idx>=len(s){
返回
}
副本(s[idx:,s[idx+1:)
s=s[:len(s)-1]
fmt印刷品编号、透镜编号、封顶编号
}
但结果显示:

[01 2 4]4 5
[01 2 4 4]5 5


据我所知,slice将作为引用类型传递给函数调用,为什么它不能修改它?

slice包含三个值:

1) 指向底层数组的指针

2) 长度

3) 容量


将slice传递给函数时,传递的是所有三个值的副本。因此,您不能更改长度和容量,但由于您有指向基础数组的指针,因此可以更改数组内的值。

切片不是指针类型。“引擎盖下”切片由3个值组成:长度、容量和指向数组的指针。当您通过值传递它时,您将获得长度和容量的副本—您可以为自己更改它们。对数组的更改将在函数外部可见


如果生成这样的结果

则切片不是引用类型,也不是真正的引用类型。此外,可能的副本:。但切片不是引用类型。这意味着两个片之间共享内存,但长度甚至封盖可能不同。它们本质上是两个不同的项目。您可以在Go博客条目“Go slices:usage and Internal”(Go slices:usage and Internal)中阅读更多关于切片的内容,尤其是。