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

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

作者: 绝望的祖父 | 来源:发表于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]

相关文章

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

    在Go语言中,函数参数是按值传递的。当使用切片(slice)作为函数参数时,意味着函数将获得切片的副本:指向基础数...

  • 函数

    匿名函数 lambda 等于 函数传递 将函数作为参数进行传递

  • Java将方法作为参数传递

    最近在用Java写一套自研爬虫框架,该框架可以通过简单的配置就可以实现目标网站的抓取,不再需要研发人员做开发,业务...

  • java8函数式编程

    将函数(方法)作为对象(参数/返回值)进行传递,即将函数作为对象的方式处理的编程方式。 Lambda表达式可以理解...

  • 第二课 js类和对象

    函数 js中函数可以作为参数传递 第一种写法 上面代码是将say方法作为参数传递给execute方法 第二种写法 ...

  • js类和对象

    函数 js中函数可以作为参数传递 第一种写法 上面代码是将say方法作为参数传递给execute方法 第二种写法 ...

  • js类和对象

    函数 js中函数可以作为参数传递 上面代码是将say方法作为参数传递给execute方法 第二种写法 第三种写法 ...

  • 将方法作为参数传递(Javascript/Ruby)

    本文展示了在Javascript和Ruby中方法是如何作为参数被传递的。 Javascript 来看上面这段代码,...

  • golang学习笔记(七)复合类型

    复合类型 类型名称作为函数参数pointer指针值传递array数组值传递slice切片引用传递map字典引用传递...

  • C# 委托(delegate)

    委托是一种引用类型,可以将方法作为参数传递给其他方法,作为参数的这个方法可以是静态方法,实例方法,也可以是匿名方法...

网友评论

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

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