前言:文本首先介绍在Go中函数的定义、调用、参数、返回值,之后将对函数的应用进行说明,最后简单介绍下内置函数
函数
在Go中,支持函数、匿名函数和闭包。
函数的定义
Go语言中,定义函数需要用到关键字func
,其格式如下:
func 函数名(参数列表)(返回值列表){
函数体
}
函数名:由字母、下划线、数字组成,规定开头第一个字母不能是数字,同时在同一个包内函数名不能重名。
参数列表:参数由参数变量 参数类型
格式组成,多个参数之间用逗号,
隔开。
返回值列表:返回值由返回值变量 返回值类型
组成,规定可以只写返回值类型,但是有多个返回值的时候必须用小括号()
将返回值包住,用逗号,
分隔。
函数体:实现函数功能的代码块
函数示例:
//求和函数
func intSum(x int, y int) int {
return x + y
}
变种:我们可以实现一个既没有参数传入也没有返回值的函数:
func voidFunc() {
fmt.Println("void funcion")
}
函数的调用
在定义了函数之后,可以通过函数名()
的方式调用函数,以上面两个函数示例:
func main() {
voidFunc()
ret := intSum(1, 1)
fmt.Println(ret)
}
其输出如下:
void funcion
2
注意:在调用有返回值的函数的时候,可以不用接受函数的返回值。
函数的参数
函数参数的简写
在Go中,如果函数参数的相邻变量的类型相同,则可以省略前面的类型书写。
示例如下:
func intSum(x, y int) int {
return x + y
}
在上面的代码中,函数intSum
有两个参数,这两个参数相邻并且参数类型都为int
,因此可以省略前面x
的参数类型。
可变参数
可变参数是指函数中参数的数量不固定,在Go中可变参数可以通过在最后书写的参数后面增加...
来表示。
示例如下:
func intSum(x ...int) int {
fmt.Println(x)
sum := 0
for _, v := range x {
sum += v
}
return sum
}
func main() {
ret1 := intSum()
fmt.Printf("ret1:%v\n", ret1)
ret2 := intSum(10)
fmt.Printf("ret2:%v\n", ret2)
ret3 := intSum(10, 20)
fmt.Printf("ret3:%v\n", ret3)
ret4 := intSum(10, 20, 30)
fmt.Printf("ret4:%v\n", ret4)
}
输出如下:
[]
ret1:0
[10]
ret2:10
[10 20]
ret3:30
[10 20 30]
ret4:60
**注意:**可变参数一定是放在所有固定参数之后;函数的可变参数是由切片实现的。
函数的返回值
在Go语言中,函数通过return
来向函数外输出返回值。
多返回值
在Go中可以有多返回值,当存在多返回值的时候,规定必须在函数参数后面用()
将所有返回值包起来。
示例如下:
func cal(x, y int) (int, int) {
sum := x + y
sub := x - y
return sum, sub
}
返回值命名
在Go中,函数定义的时候可以给返回值命名,并且再命名之后可以直接使用这些命名返回值变量,最后通过return
进行返回。
如下示例:
func cal(x, y int) (sum, sub int) {
sum = x + y
sub = x - y
return sum, sub //sum,sub在这里可以直接省略不写
}
返回值切片
在Go中,当返回值的类型为slice时,可以把返回值设定为nil
,nil
可以看做一个有效的slice
,而没必要去显示一个长度为0
的切片。
示例如下:
func someFunc(x string) []int {
if x == "" {
return nil //没必要去返回[]int{}
}
...
}
函数应用
函数变量的作用域
全局变量
在Go中变量也分为全局变量和局部变量。全局变量定义在函数体之外,它定义之后在程序的整个运行周期都有效,并且再函数中也可以直接访问函数变量。
示例如下:
package main
import "fmt"
var n int64 = 998
func testG