Golang-函数调用机制分析(值传递与引用传递)

1. 值传递

基本数据类型和数组作为参数会进行值传递

接下来看一个最简单的例子

import "fmt"

func test(num int) {
	num = num +1
	fmt.Println("test : ", num)
}

func main() {
	num := 10
	test(num)
	fmt.Println("main : ", num)
}

如果大家有其他语言的开发经验,应该很容易看出来程序的输出结果是

test : 11
main : 10

2. 引用传递

还是与上面的例子相同,只不过函数参数改为指针类型

import "fmt"

func test(ptr *int) {
	*ptr = *ptr +1
	fmt.Println("test : ", *ptr)
}

func main() {
	num := 10
	ptr := &num
	test(ptr)
	fmt.Println("main : ", num)
}

我们再来看一下输出结果

test : 11
main : 11

这两种不同的输出结果,底层到底是如何实现的呢,

3. 程序运行时的内存分析

对于程序而言,在运行是操作系统会为其分配一块内存,以满足程序的运行需要,程序的进程会将这块内存分为三个部分,分别是:1. 栈区 2. 堆区 3. 代码区。这是人为的逻辑上的划分。

后面会有专门的文章来做golang的GC分析以及涉及到的逃逸分析等

  • 栈区:一般来说存储基本数据类型
  • 堆区:一般来说存储引用数据类型
  • 代码区: 存储代码本身

3.1 值传递内存分析

下面我们就来对照一下代码与逻辑上的分区来看一下到底是什么输出结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.2 引用传递内存分析

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4. 总结

以上就是值传递与引用传递的分析。注意其中的栈,堆等均为人为的逻辑分区,每个程序在运行过程中也未必会严格按照此进行内存的分配,这里是为了解释方便,后期在做GC等分析的时候也会有更详细的说明。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值