在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在面试中,经常会被问起,这门语言的参数传递是值传递还是引用传递,当然,大部分情况下我们都会提前准备,有恃无恐,但还是希望能够精益求精嘛,所以针对Go语言来分析,Go传参是值传递还是引用传递。那首先,我们先来了解什么是值传递,什么是引用传递。 值传递值传递就是函数传递的是传进来参数的一个副本。换个说法就是函数内部修改传入参数的值是函数外部传入值得一个拷贝,所以你在函数内部对这个值进行修改也不会影响外部该参数的值,的确很难表达,看个案例:
输出:
很直观,参数a在进入函数后并没有被改变,我们还可以看看两个内存地址是否相同
输出为:
可以看到两个内存地址并不一样,这就对了,可以说明 这个时候,我们就会使用指针来修改值,指针案例:
输出:
可以看到两次内存地址也是不一样的,所以其实指针也是值传递,但是指针保存的是内存地址,而在函数中修改语句"*ip=1",其实是在修改变量i内存地址对应的值,那自然就是能够修改的。 引用传递Go语言其实并没有引用传递,上面的例子可以证明如果内存地址不同自然就是值传递,那内存地址相同就是引用传递。 我们再通过Map类型进行验证,Map类型可以通过函数修改内容,但是他没有明显的指针。
输出:
发现两个内存地址是不一样的,所以这又是一个值传递,那为什么没有使用指针却修改了Map的内容? 查看一下map源码
我们发现这个方法返回的是
返回的还是一个指针,所以我们可以得出map的传递也是值传递。 结论确认Go语言中所有的传参都是值传递。但是传递的类型如果是int、string、struct等这些,那在函数中无法修改原参数内容数据;如果是指针、map、slice、chan等这些,在函数中可以修改原参数内容数据。 |
请发表评论