函数是为了执行特定任务而存在于程序内的一组语句,函数接受输入并返回输出。
函数允许将常用的代码块提取出来成为单个组件。
使用最广的Go函数是main(),每个独立的Go程序都必须有个main函数。
创建函数
函数声明以func关键字开头,后跟函数名字、一对括号(),然后是函数代码块。
下面的示例有一个名为SimpleFunction的函数。它不接受任何参数,也不返回任何值。
结果:
Hello World
有参数的函数
数据可以通过参数传递给函数,一个参数就像一个变量。
参数在函数名后面的括号内指定,可以添加任意多个参数,需用逗号分隔它们。
下面的示例是一个带有两个int类型参数的函数。调用add()函数时,传递两个整数值(例如20,30):
结果:
50
如果函数名以大写字母开头,该函数将导出到其他包中。如果函数名以小写字母开头,则不会将其导出到其他包,但可以在同一包中调用此函数。
有返回值的函数
在本例中,add()函数接受两个整数参数,并返回一个名为total的整数值。
注意,当返回值声明为函数签名的一部分时,返回语句是必需的:
参数值和返回值的类型必须与函数签名匹配,如果修改上面的程序并在参数中传递一些字符串值,那么程序将会抛出一个异常。
命名返回值
Golang允许命名函数的返回值,可以通过定义变量来命名返回值,这里在函数声明中为函数的返回值定义了一个整数类型的变量area:
结果:
C:\Golang>go run main.go
Parameter: 100
Area: 600
由于函数声明了返回值,因此执行流程的最后一条逻辑语句必须是返回语句。
返回多个值
Golang中的函数可以返回多个值,这在许多场合下很有用。
下面的例子声明有两个返回值的函数:
注意:
- 函数名必须以字母开头,并且可以有任意数量的字母和数字。
- 函数名不能以数字开头。
- 函数名不能包含空格。
- 以大写字母开头的函数将导出到其他包中,以小写字母开头的函数则不会将导出到其他包中,但可以在同一包中调用。
- 如果一个函数名由多个单词组成,那么第一个单词后面的每个单词都应该大写如下:empName、EmpAddress等。
- 函数名区分大小写(car、Car和CAR是三个不同的变量)。
将地址传递给函数
把变量的地址传递给函数,在函数体内部的使用解引用修改该变量的值:
结果:
C:\Golang>go run main.go
Before: John 20
After : John Doe 25
匿名函数
匿名函数是没有名字函数,没有任何指定的标识符来引用它。匿名函数可以接受输入并返回输出,就像标准函数一样。
匿名函数定义后赋给变量或立即调用。
定义匿名函数,并将其赋给变量:
定义接收参数的匿名函数:
定义接收参数和有返回值的匿名函数:
匿名函数常用于实现不需要命名且临时使用的功能。
闭包 函数
闭包是匿名函数的特殊用法,它是访问在函数体外部定义的变量的匿名函数。
访问函数体外定义的变量的匿名函数:
每次循环迭代中在函数体内访问外部的变量的匿名函数:
高阶函数
高阶函数是以函数作为输入参数或以函数作为输出返回值的函数。
高阶函数是对其他函数进行操作,将它们作为参数,也可以返回它们。
将函数作为参数传递给其他函数:
结果:
C:\Golang>go run main.go
10
在上面的程序中,partialSum函数返回一个sum函数,该函数接受两个int参数并返回一个int参数。
返回从其他函数返回的函数:
结果:
C:\Golang>go run main.go
110
在上面的程序中,指定该函数的签名返回两个函数和一个整型值。
用户定义的函数类型
Golang还支持定义自己的函数类型,使用type关键字。
上述程序的修改版本,功能类型如下: