这个世界是被精心设计过的
几乎所有编程语言都支持函数。函数是一段封装了特定功能的可重用代码。
函数定义
Go 普通函数的基本组成包括:关键字 func、函数名、参数列表、返回值、函数体和返回语句。作为强类型语言,无论是参数还是返回值,在定义函数时,都要声明其类型:
函数调用
- 同包调用
如果是在同一个包中(即定义在同一个目录下的 Go 文件中),只需直接调用即可。
- 异包调用
如果是在不同的包中,需要先导入了该函数所在的包,然后才能调用该函数。在调用其他包定义的函数时,只有函数名首字母大写的函数才可以被访问。Go 语言中没有 public、protected、private 之类的关键字,它是通过首字母的大小写来区分可见性的:首字母小写的函数只能在同一个包中访问,首字母大写的函数才可以在其他包中调用,Go 文件中定义的全局变量也是如此。
传递参数
- 值传递
值传递是指在函数或方法调用时,将实际参数的值复制一份传递给被调用函数或方法的形式参数。这意味着在被调用函数或方法中对形式参数进行修改不会影响原始参数的值。
- 引用传递
引用传递是指在函数或方法调用时,将实际参数的地址传递给被调用函数或方法的形式参数。这意味着在被调用函数或方法中对形式参数进行修改将影响原始参数的值。
变长参数
所谓变长参数指的是函数参数的数量不确定,可以按照需要传递任意数量的参数到指定函数,合适地使用变长参数,可以让代码更简洁。
在参数类型前加上 ... 前缀,就可以将该参数声明为变长参数:
变长参数还支持传递一个 []int 类型的切片,传递切片时需要在末尾加上 ... 作为标识,表示对应的参数类型是变长参数:
多返回值
Go 函数与其他编程语言一大不同之处在于支持多返回值,这在处理程序出错的时候非常有用。
命名返回值
在设置多返回值时,还可以对返回值进行变量命名。
匿名函数
匿名函数是一种没有指定函数名的函数声明方式(与之相对的,有名字的函数被称为具名函数。
- 匿名函数作为函数参数
- 将匿名函数作为函数返回值
闭包
闭包是由函数及其相关引用环境组合而成的实体( 即:闭包 = 函数 + 引用环境 ),闭包只能通过匿名函数实现,我们可以把闭包看作是有状态的匿名函数,反过来,如果匿名函数引用了外部变量,就形成了一个闭包(Closure)