友情提示:380元/半年,儿童学编程,就上码丁实验室。
普通函数的声明形式
Go 语言的函数声明以 func 标识,后面紧接着函数名、参数列表、返回参数列表及函数体,具体形式如下:
func 函数名(参数列表)(返回参数列表){
函数体
}
下面是对各个部分的说明:
-
函数名:由字母、数字、下画线组成。其中,函数名的第一个字母不能为数字。在同一个包内,函数名称不能重名。
包(package)是 Go 源码的一种组织方式,一个包可以认为是一个文件夹,在后续章节中将会详细讲解包的概念。
-
参数列表:一个参数由参数变量和参数类型组成,例如:
func foo( a int, b string )
其中,参数列表中的变量作为函数的局部变量而存在。
- 返回参数列表:可以是返回值类型列表,也可以是类似参数列表中变量名和类型名的组合。函数在声明有返回值时,必须在函数体中使用 return 语句提供返回值列表。
- 函数体:能够被重复调用的代码片段。
参数类型的简写
在参数列表中,如有多个参数变量,则以逗号分隔;如果相邻变量是同类型,则可以将类型省略。例如:
func add(a, b int) int { return a + b }
以上代码中,a 和 b 的参数均为 int 类型,因此可以省略 a 的类型,在 b 后面有类型说明,这个类型也是 a 的类型。
函数的返回值
Go 语言支持多返回值,多返回值能方便地获得函数执行后的多个返回参数,Go 语言经常使用多返回值中的最后一个返回参数返回函数执行中可能发生的错误。示例代码如下:
conn, err := connectToNetwork()
在这段代码中,connectToNetwork 返回两个参数,conn 表示连接对象,err 返回错误。
其它编程语言中函数的返回值
- C/C++ 语言中只支持一个返回值,在需要返回多个数值时,则需要使用结构体返回结果,或者在参数中使用指针变量,然后在函数内部修改外部传入的变量值,实现返回计算结果。C++ 语言中为了安全性,建议在参数返回数据时使用“引用”替代指针。
- C# 语言也没有多返回值特性。C# 语言后期加入的 ref 和 out 关键字能够通过函数的调用参数获得函数体中修改的数据。
- lua 语言没有指针,但支持多返回值,在大块数据使用时方便很多。
Go 语言既支持安全指针,也支持多返回值,因此在使用函数进行逻辑编写时更为方便。
1) 同一种类型返回值
如果返回值是同一种类型,则用括号将多个返回值类型括起来,用逗号分隔每个返回值的类型。
使用 return 语句返回时,值列表的顺序需要与函数声明的返回值类型一致。示例代码如下:
func typedTwoValues() (int, int) { return 1, 2 } a, b := typedTwoValues() fmt.Println(a, b)
代码输出结果:
1 2
纯类型的返回值对于代码可读性不是很友好,特别是在同类型的返回值出现时,无法区分每个返回参数的意义。
2) 带有变量名的返回值
Go 语言支持对返回值进行命名,这样返回值就和参数一样拥有参数变量名和类型。
命名的返回值变量的默认值为类型的默认值,即数值为 0,字符串为空字符串,布尔为 false、指针为 nil 等。
下面代码中的函数拥有两个整型返回值,函数声明时将返回值命名为 a 和 b,因此可以在函数体中直接对函数返回值进行赋值。在命名的返回值方式的函数体中,在函数结束前需要显式地使用 return 语句进行返回,代码如下:
func namedRetValues() (a, b int) { a = 1 b = 2 return }
代码说明如下:
- 第 1 行,对两个整型返回值进行命名,分别为 a 和 b。
- 第 3 行和第 4 行,命名返回值的变量与这个函数的布局变量的效果一致,可以对返回值进行赋值和值获取。
-
第 6 行,当函数使用命名返回值时,可以在 return 中不填写返回值列表,如果填写也是可行的。下面代码的执行效果和上面代码的效果一样。
func namedRetValues() (a, b int) { a = 1 return a, 2 }
提示
同一种类型返回值和命名返回值两种形式只能二选一,混用时将会发生编译错误,例如下面的代码:
func namedRetValues() (a, b int, int)
编译报错提示:
mixed named and unnamed function parameters
意思是:在函数参数中混合使用了命名和非命名参数。
调用函数
函数在定义后,可以通过调用的方式,让当前代码跳转到被调用的函数中进行执行。调用前的函数局部变量都会被保存起来不会丢失;被调用的函数结束后,恢复到被调用函数的下一行继续执行代码,之前的局部变量也能继续访问。
函数内的局部变量只能在函数体中使用,函数调用结束后,这些局部变量都会被释放并且失效。
Go语言的函数调用格式如下:
返回值变量列表 = 函数名(参数列表)
下面是对各个部分的说明:
- 函数名:需要调用的函数名。
- 参数列表:参数变量以逗号分隔,尾部无须以分号结尾。
- 返回值变量列表:多个返回值使用逗号分隔。
例如,加法函数调用样式如下:
result := add(1,1)