go语言函数间的调用关系 go语言函数和方法

3.6 Go语言函数的延迟调用(Deferred Code)在以下这段代码中,我们操作一个文件,无论成功与否都需要关闭文件句柄 。这里在三处不同的位置都调用了file.Close()方法,代码显得非常冗余 。
我们利用延迟调用来优化代码 。定义后的defer代码,会在return之前返回 , 让代码显得更加紧凑,且可读性变强,对上面的代码改造如下:
我们通过这个示例来看一下延迟调用与正常代码之间的执行顺序
先简单分析一下代码逻辑:
从输出中,我们可以观察到如下现象:
从这个实例中,我们很明显观察到 , defer语句是在return之前执行
如果一个函数内定义了多个defer , 则调用顺序为LIFO(后进先出)方式执行 。
仍然是相同的例子,但是在TestDefer中我们定义了三个defer输出 , 根据LIFO原则,输出的顺序是3rd-2nd-1st,根据最后的结果,也是逆向向上执行defer输出 。
就在整理这篇笔记的时候,发现了自己的认知误区 , 主要是本节实例三中发现的,先来看一下英文的描述:
对于上面的这段话的理解:
下面是代码执行输出,我们来一起分析一下:
虽然在a()函数内,显示的返回了10,但是main函数中得到的结果是defer函数自增后的结果,我们来分析一下代码:
在这篇文章的上一版,我曾经尝试用指针取解释defer修改返回值的类型,但是感觉不够透彻,也让阅读者非常困惑,索性参考了一下go官方blog中的一篇文章,在此基础上进行了扩展 。如需要阅读原文,可以参考下面的文章 。
浅谈Go语言函数与方法的区别前段时间go语言函数间的调用关系,我们实验室用go作为后台开发语言开发了一个web项目go语言函数间的调用关系 , 由于这是自己第一次使用go语言进行开发,在开发过程中,一味着追求完成任务,在编码的时候没有太注重性能 , 虽然勉强实现了功能,但是对go语言的理解还是比较浅显的 。下面来谈谈自己对go语言中函数与方法的理解 。
普通函数:
go函数可以返回多个值
值传递: 值传递是指在调用函数时将实际参数复制一份传递到函数中 , 这样函数中如果对参数进行修改,将不会影响到实际参数
引用传递: 引用传递是指在调用函数将实际参数的地址传递到函数中,那么在函数中对参数进行的修改,将影响到实际参数 。
一般来说go语言函数的 接收者(也就是形参)一般放在函数名后面  , 不能将指针类型的数据直接传递,也就是说函数形参如果是值类型,调用者必须使用值作为实参过来,如果函数形参是指针类型 , 则函数调用者需使用指针作为实参来调用 。
普通方法:
接收者是在func关键字后面,而不是在函数名称后面,接收者可以是自己定义的一个类型,这个类型可以是struct、interface,一个方法就是一个包含了接收者的函数,接收者可以是命名类型或者是结构体类型的一个值或者是一个指针 。
下面是一个例子来说明方法和函数的区别(重点)
Go语言中怎么通过一个字符串调用对应名称的函数按值传递函数参数go语言函数间的调用关系,是拷贝参数的实际值到函数的形式参数的方法调用 。在这种情况下go语言函数间的调用关系,参数在函数内变化对参数不会有影响 。
默认情况下,Go编程语言使用调用通过值的方法来传递参数 。在一般情况下,这意味着 , 在函数内码不能改变用来调用所述函数的参数 。考虑函数swap()的定义如下 。
代码如下:
/* function definition to swap the values */

推荐阅读