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
的第一个元素。由于切片s
和mySlice
引用的是同一个底层数组,所以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
函数创建了一个新的底层数组。