将切片作为方法参数进行传递

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]
上一篇下一篇

猜你喜欢

热点阅读