区块链基础语言(十三)——Go语言函数(上)

函数这一章节主要分为五个部分讲解,分别为:内置函数、自定义函数、变量作用域、匿名函数与闭包、递归函数。本节讲解内置函数、自定义函数和变量作用域。

一、内置函数

1.1 常见的内置函数常见的内置函数如表1所示。

区块链基础语言(十三)——Go语言函数(上)

1.2 内置函数的调用过程

1.2.1 步骤

第一步:先导入该函数所在的包;
第二步:再调用,调用格式为:包名.函数名

1.2.2 示例

区块链基础语言(十三)——Go语言函数(上)

二、自定义函数

2.1 定义格式

区块链基础语言(十三)——Go语言函数(上)

注:
a. 函数是基本的代码块,用于执行一个任务。Go语言通过函数来划分任务,不同功能的函数执行的是指定的任务;
b. Go语言最少有一个main()函数;
c. 函数由关键字 func 开始声明,函数声明告诉了编译器函数的名称,返回参数和类型;
d. FuncName即函数名称,根据约定:函数名首字母小写即private,只能在本包里使用;大写即public,可以被外部包调用;
e. 返回类型:
① 上面返回值声明了两个变量名a和b(命名返回参数),变量名不是必须需要,可以只有类型没有变量名;
② 如果只有一个返回值且不声明返回值变量,可以省略变量名和返回值的括号,保留变量类型;
③ 如果没有返回值,那么就直接省略最后的返回信息。如果有返回值,那么必须在函数的内部添加return语句。

2.2 函数参数

2.2.1 参数分类

函数参数可以分为形式参数和实际参数两类,如表2所示。

区块链基础语言(十三)——Go语言函数(上)

函数的形参和实参具有以下特点:
a. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
b. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
c. 实参和形参在数量上、类型上、顺序上应严格一致,否则会发生类型不匹配的错误。
d. 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

区块链基础语言(十三)——Go语言函数(上)

2.2.2 参数传递

参数传递分为值传递和引用传递,如表3所示。

区块链基础语言(十三)——Go语言函数(上)

值传递和引用传递的示例如下:

区块链基础语言(十三)——Go语言函数(上)

2.2.3 参数种类

实参可以是常量、变量、函数,也可以是数组、切片,但必须是确定的值。数组和切片在后面章节再做介绍,常量、变量在前面章节已经介绍过,这里主要介绍函数作为参数的情况:

区块链基础语言(十三)——Go语言函数(上)

2.3 自定义函数种类

2.3.1 无参无返值

无参无返回值就是既没有传入参数,也没有返回值。

区块链基础语言(十三)——Go语言函数(上)

2.3.2 有参无返回值

有参无返回值就是有传入的参数,没有返回值。a. 普通参数列表

区块链基础语言(十三)——Go语言函数(上)

b. 不定参数列表
形如“… type”格式的类型只能作为函数的参数类型存在,“… type”本质上是切片。

区块链基础语言(十三)——Go语言函数(上)

2.3.3 无参有返回值

没有传入参数、有返回值的函数,必须有明确的终止语句,否则会引发编译错误。return 语句可以跳出当前函数。
a. 一个返回值

区块链基础语言(十三)——Go语言函数(上)

b. 多个返回值

区块链基础语言(十三)——Go语言函数(上)

2.3.4 有参与返回值

有参有返回值就是有传入的参数,有返回值。

区块链基础语言(十三)——Go语言函数(上)

三、变量作用域

3.1 变量作用域的分类

变量作用域指的是变量在源代码中的作用范围。根据其作用范围,分为两种:局部变量和全局变量,如表4所示。

区块链基础语言(十三)——Go语言函数(上)

3.2 不同作用域的同名变量的访问原则

a. 在同一个作用域内,就近访问最近的变量;
b. 如果此作用域没有此变量声明,则访问全局变量;
c. 如果全局变量也没有,则报错。

3.3 示例

区块链基础语言(十三)——Go语言函数(上)

参考资料
[1] p/5635325.html