美文网首页
将切片作为方法参数进行传递

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

作者: 绝望的祖父 | 来源:发表于2018-08-28 16:59 被阅读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]
    

    相关文章

      网友评论

          本文标题:将切片作为方法参数进行传递

          本文链接:https://www.haomeiwen.com/subject/hgdqwftx.html