本人从事Go语言开发多年,目前主要从事云计算相关开发。
写本公众号的目的主要是对自己的过往知识进行梳理,也希望可以帮助大家学习~
后续会推出Go语言源码学习系列和web开发系列等,欢迎大家关注。
前面我们提到:常量和变量都是数据的一种载体,数据通过不同的运算符参与运算时,对计算的流程进行一定程度的控制便是流程控制,并且低于较多的数据通过内置容器进行存储,那么之后要干嘛呢?就是通过以上的所有概念进行整合,将其抽象到一个模块中去完成某一功能,这便是本篇的主题——函数
那么对于函数这个新概念,应该做怎样的思考呢?
思维逻辑图如下:
下面我们从以上三个方面对函数进行相应的介绍
golang语言中,函数的声明通过关键字func开始,标准格式如下:
解释:以上我们便声明了一个函数,该函数具有两个参数,函数的参数通过参数名和参数类型表示,如上图中的num1 int64或者num2 int64,返回值列表因为我们是返回单值,所以括号可以省略
注:v...T表明v为一个切片,T为切片中数据的类型
解释:上面我们声明一个可变参数的函数:multipleForNums,nums ...int64代表nums为一个切片,int64为切片中存储的数据类型,所以在计算中,我们可以通过range关键字进行遍历
01和02中我们分别介绍了固定参数和可变参数的声明,那么假如一个函数既有固定参数又有可变参数,那么该如何声明呢?格式如下:
注:可变参数位于固定参数列表之后
解释:multipleAfterTwoNumAdd实现了在a和b相加之后,再乘以多个倍数因子的功能,当前我们主要是为了举一个固定参数和可变参数结合的函数声明的例子,例子可能不具有实用性
在函数的声明小节中,我们定义的函数均可称为自定义函数,所以在此将不再做相应的介绍,我们可以将内置函数以外所有的函数称为自定义函数
解释:切片在初始化后,自动填充了该数据类型的默认值:int默认值为0,string默认值为空字符串,bool为false;
注意:a) 当为numSlice增加元素4时,由于切片的长度小于数组的长度,而且切片的最后一个元素的下标为1,不等于数组的最后一个元素的下标2,所以对切片增加4时,会导致数组num的修改变为[1,2,4];b) 当切片的长度等于切片容量时,下一次使用append()函数添加元素,容量会以2倍的方式扩容,所以当增加5时切片扩容为6;c) 当切片增加5时,由于切片长度已经等于数组的长度,所以不会再改变新的数组的元素值;
6)new:为切片、映射和通道channel类型以外的类型分配内存并初始化对象,返回的类型为指针类型。以为一个指针指针变量分配内存并初始化对象为例:
解释:通过new()函数实现了对指针变量p的内存分配和初始化
7)comlex:生成一个复数;real:返回复数的实部;imag:返回复数的虚部;
9)close:用于关闭通道channel;panic:用于触发宕机;recover:用于捕获panic抛出的异常信息;这三个内置函数我们将在之后的相关章节进行介绍
函数的使用即函数的调用,固定参数和可变参数函数的使用均可以通过函数名直接调用,如前文我们定义的相乘的多个函数,可以直接通过函数名调用使用
如上,在可变参数的传递过程中,仍然需要有三个点:...
既然谈到了参数的传递,我们现在讨论一下参数传递的过程:参数传递分为值传递和引用传递。
值传递是指将变量的一个副本传递给函数,经过函数的操作,变量的原值不发生改变;
引用传递是指将变量的地址传递给函数,经过函数的操作,变量的原值会发生改变;
其实本质上都是"值传递",只是引用传递中传递的值为地址,而地址指向了原变量的值,所以可以修改原变量
所以:
1)对于int,string,bool等类型的变量传递是值传递;
2)对于指针,切片,映射和通道等引用类型的变量传递为引用传递
示例:
结果如下:
解释:可见通过值传递只是原变量的副本,并没有改变原变量的值;通过引用传递仍然是一个副本,但是该副本的值为原变量的地址,所以导致了原变量值的改变;
因为匿名函数较为特殊, 所以将匿名函数的定义和使用放在了一起进行介绍。匿名函数是指没有函数名的函数,格式如下:
到此关于Golang函数的分享就结束了~
此篇为Go语言基础系列分享第五篇,欢迎大家关注本公众号《Go开发与计算机技术》,Go语言基础系列学习不迷路。