将切片作为方法参数进行传递
2018-08-28 本文已影响45人
绝望的祖父
在Go语言中,函数参数是按值传递的。当使用切片(slice)作为函数参数时,意味着函数将获得切片的副本:指向基础数组的起始地址的指针,以及切片的长度和容量。由于函数知道用于存储数据的内存地址,因此现在可以调整切片。 让我们看看以下示例:
package main
import (
"fmt"
)
func modifyValue(s []int) {
s[1] = 3
fmt.Printf("In modifyValue: s is %v\n", s)
}
func main() {
s := []int{1, 2}
fmt.Printf("In main, before modifyValue: s is %v\n", s)
modifyValue(s)
fmt.Printf("In main, after modifyValue: s is %v\n", s)
}
程序运行的结果如下:
In main, before modifyValue: s is [1 2]
In modifyValue: s is [1 3]
In main, after modifyValue: s is [1 3]
可以看到,在函数modifyValue
函数执行之后,切片s
的内容发生了改变,即使modifyValue
函数只能够获取底层数组地址的拷贝。
让我们再看另外一个例子:
package main
import (
"fmt"
)
func addValue(s []int) {
s = append(s, 3)
fmt.Printf("In addValue: s is %v\n", s)
}
func main() {
s := []int{1, 2}
fmt.Printf("In main, before addValue: s is %v\n", s)
addValue(s)
fmt.Printf("In main, after addValue: s is %v\n", s)
}
程序运行的结果如下:
In main, before addValue: s is [1 2]
In addValue: s is [1 2 3]
In main, after addValue: s is [1 2]
这一次,函数addValue
并没有影响到main
函数中的切片s
,这是因为addValue
函数只是在操作s
的拷贝,而不是真实的s
。
因此,如果你的确希望函数能够改变切片本身,你可以将切片的地址传递给函数:
package main
import (
"fmt"
)
func addValue(s *[]int) {
*s = append(*s, 3)
fmt.Printf("In addValue: s is %v\n", s)
}
func main() {
s := []int{1, 2}
fmt.Printf("In main, before addValue: s is %v\n", s)
addValue(&s)
fmt.Printf("In main, after addValue: s is %v\n", s)
}
这一次,运行结果如下:
In main, before addValue: s is [1 2]
In addValue: s is &[1 2 3]
In main, after addValue: s is [1 2 3]