在Go中按值传递时,为什么有时会更改切片?
不知道大家有没有发现在一个函数内部对切片参数进行了排序后也会改变函数外部原来的切片中元素的顺序,但是在函数内向切片增加了元素后在函数外的原切片却没有新增元素,更奇怪的是添加并排序后,外部的切片有可能元素数量和元素顺序都不会变,这是为什么呢?我们通过三个小测验来解释造成这个现象的原因。
测验一
下面的代码的输出什么?
func main() {
var s []int
for i := 1; i <= 3; i++ {
s = append(s, i)
}
reverse(s)
fmt.Println(s)
}
func reverse(s []int) {
for i, j := 0, len(s) - 1; i < j; i++ {
j = len(s) - (i + 1)
s[i], s[j] = s[j], s[i]
}
}
Run it on the Go Playground → https://play.golang.org/p/faJ3WNxpRw
上面的代码中虽然通过值传递了s
,为什么在函数调用后在外部仍能看到