{{image.png(uploading...)}}![`(~AG5CG]RY[DGS_@B79NI5.png](https://static.studygolang.com/190516/4b83bc099c1f02e388f20d1272d7f805.png)
你可以理解为将func进栈,然后根据退出条件一个一个将栈里的func弹出
```
压栈:
func(3)
func(2)
func(1)
func(0)
```
#5
更多评论
/*
#. func main() {
#. Test12(3)
#. }
#.
#.
#. func Test12(a int) {
#. if a == 0 {
#. return
#. }
#. a--
#. Test12(a)
#. fmt.Println(a)
#. }
main()中调用Test12()函数,并传入参数3,Test12()函数加载进内存,递归开始 【此时内存中存在本次调用产生的局部变量a = 3】
1. a = 3 判断3不等于0,跳过if语句中体代码
2. a-- 此时a等于2,继续往下执行 【此时内存中存在本次调用产生的局部变量a = 2】
3. 调用函数本身,再次在内存中加载Test12()函数
4. 判断 a = 2 不等于0,条件不满足,跳过if语句中代码
5. a-- 此时a等于1,继续往下执行 【此时内存中存在本次调用产生的局部变量a = 1】
6. 调用函数本身,再次在内存中加载Test12()函数
7. 判断 a = 1 不等于0,条件不满足,跳过if语句中代码
8. a-- 此时a等于0,继续往下执行 【此时内存中存在本次调用产生的局部变量a = 0】
9. 判断 a = 0 满足条件,执行if语句中代码
10. return 返回到函数的调用处Test12(a),向下继续执行代码
11. 然后执行fmt.Println(a),函数全部执行结束,在内存中消失【此处打印的是局部变量 a = 0】
12. 因为前面Test12()还函数加载了三次,会按照进内存的顺序,由后往前依次执行等待的代码,然后出内存
*/
#1