Golang的切片作为函数参数是值传递还是引用传递?

在Go中,所有的函数参数都是值传递,也就是说函数总是接收值的一个副本。然而,对于切片来讲,虽然它是值传递,但由于切片的定义包含了对底层数组的引用,所以在函数内部对切片的修改可以影响到原切片。

下面是一个例子,演示了在函数内部修改切片如何影响到原切片:

package main

import "fmt"

func changeSlice(s []int) {
    s[0] = 100
}

func main() {
    mySlice := []int{1, 2, 3}
    changeSlice(mySlice)
    fmt.Println(mySlice) // 输出:[100 2 3]
}

在这个例子中,我们在changeSlice函数内部修改了切片s的第一个元素。由于切片smySlice引用的是同一个底层数组,所以mySlice的第一个元素也被改变了。

然而,如果你在函数内部改变了切片的长度或容量(比如通过append函数或make函数),那么这个改变不会影响到原切片,因为这会创建一个新的底层数组。例如:

package main

import "fmt"

func appendSlice(s []int) {
    s = append(s, 4)
}

func main() {
    mySlice := []int{1, 2, 3}
    appendSlice(mySlice)
    fmt.Println(mySlice) // 输出:[1 2 3]
}

在这个例子中,我们在appendSlice函数内部通过append函数改变了切片s的长度,但这个改变并没有影响到mySlice,因为append函数创建了一个新的底层数组。

发表评论

后才能评论