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
等分析的时候也会有更详细的说明。
原文地址:https://blog.csdn.net/gopher9511/article/details/140503000
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!