go中函数定义用func
func 函数名(参数)(返回值){ 函数体 } 说明: 函数名:在同一个包内,函数名也称不能重名 参数:参数由参数变量和参数变量的类型组成,多个参数之间使用,分隔。 返回值:返回值由返回值变量和其变量类型组成,也可以只写返回值的类型,多个返回值必须用()包裹,并用,分隔。
牢记函数的标准格式,其他简写都是有标准格式而来 例如: func f(x int, y int) (i int) { a := x + 1 b := y + 1 i = a + b return i }
参数类型相同可以简写 func f(x, y int) int { return x + y }
可变参数:可变参数通过在参数名后加...来标识,一般是最后一个参数 func f(x ...int) int { fmt.Println(x) //x是一个切片 sum := 0 for _, v := range x { sum = sum + v } return sum }
函数多返回值:函数定义时有多个返回值时必须用()将所有返回值包裹起来 func f(x, y int) (int, int) { a := x + y b := x - y return a, b }
返回值命名,函数定义时可以为返回值命名,函数体中只需要一个return就行
func f(x, y int) (sum int) {
sum = x + y
return
}
变量作用域
全局变量:定义在函数外部的变量,它在程序整个运行周期内都有效。 在函数中可以访问到全局变量 局部变量: 1、函数内:函数内定义的变量无法在该函数外使用,局部变量和全局变量重名,优先访问局部变量。 2、if条件判断、for循环、switch语句上使用这种定义变量:此变量只在该语句块中生效,语句块之外无法使用该变量
高阶函数
高阶函数指函数可以作为变量或者返回值
例如:
func add(x, y int) int {
return x + y
}
//2个int类型参数,一个func类型参数(该func接收2个int参数,且返回值为int)
func calc(x, y int, op func(int, int) int ) int {
return op(x, y)
}
func main() {
ret2 := calc(10, 20, add)
fmt.Println(ret2) //30
}
匿名函数
在go语言中,在函数内不能在定义标准类型的函数,但是可以使用匿名函数 匿名函数格式如下: func(参数)(返回值){ 函数体 } 因为匿名函数没有名字,不能像普通函数一样调用,匿名函数需要保存到某个变量或者作为立即执行函数 例如: func main() { // 将匿名函数保存到变量 add := func(x, y int) { fmt.Println(x + y) } add(10, 20) // 通过变量调用匿名函数 //自执行函数:匿名函数定义完加()直接执行 func(x, y int) { fmt.Println(x + y) }(10, 20) }
defer语句
defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时,将延迟处理的语句按defer定义的逆序进行执行,也就是说,先被defer的语句最后被执行,最后被defer的语句,最先被执行。
在Go语言的函数中return语句在底层并不是原子操作,它分为给返回值赋值和RET指令两步。而defer语句执行的时机就在返回值赋值操作后,RET指令执行前