面试官:切片作为函数参数是传值还是传引用?

切片传参的幻觉 - 传引用

golang中函数的参数为切片时是传引用还是传值?对于这个问题,当你百度一轮过后,你会发现很大一部分人认为是传引用,通常他们会贴出下面这段代码进行佐证:

上面代码中,在main函数里边初始化一个切片变量slice,接着调用changeSlice函数,参数为切片变量slice。而函数changeSlice的主要处理逻辑是改变切片的第二个元素的值。下面我们看一下运行打印的结果:

slice: [0 1 2 3] 
slice: [0 111 2 3]

从输出结果我们看到,函数changeSlice内对切片的修改,main函数中的切片变量slice也跟着修改了。咋一看,这不就是引用传递的表现吗?

但事实上真的传引用吗?

理清三个重要概念

在探讨函数切片参数到底是以哪种方式传递时,我们先来理清下面三个重要的概念:

  • 传值(值传递)
  • 穿指针
  • 传引用(引用传递)

传值(值传递)

是指在调用函数时将实际参数拷贝一份传递到函数中,这样在函数中对参数进行修改不会影响到实际参数。这个简单不必赘述。

传指针

形参是指向实参地址的指针,当对形参的指向进行操作时,就相当于对实参本身进行操作。听起来比较绕是吧,我们来看个例子就知道了:

上面代码中定义了一个变量 a,并把地址保存在指针变量pa里面;接着打印pa的值和pa的地址,然后调用modify函数,参数为指针变量pa;modify函数中首先打印形参p的值和p的地址,接着修改p的值为1。

我们打印输出的结果:

从输出结果中我们可以看到,这是一个指针的拷贝。指针pa 和 p 的值虽然相同,但是存放这两个指针的内存地址是不同的,因此这是两个不同的指针。

注意:任何存放在内存里的东西都有自己的地址,指针也不例外,它虽然指向别的数据,但是也有存放该指针的内存

结合图来看相信会更清晰一点:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值