目录
1.函数的格式
格式:func 函数名(参数列表) (返回值类型列表){
//函数体
}
2.函数定义的几种形式
// 无参数无返回值
func f1() {
fmt.Println("无参数无返回的函数")
}
// 有参数无返回值
func f2(a, b int) {
fmt.Println("有参数无返回值", a+b)
}
// 有参数有返回值
func f3(x, y int) (int, int) {
return y, x
}
3.函数传递可变参数
//一个函数只能传递一个可变参数;如果函数有多个参数,可变参数要放在最后
func getSum(sum int, nums ...int) int {
for i := range nums {
sum += nums[i]
}
return sum
}
4.递归函数
// 递归实现1-n求和功能
func getSum(n int) int {
if n == 1 {
return 1
}
return getSum(n-1) + n
}
// 递归获取斐波那契数指定位置的数据 1 1 2 3 5 8...
func getFb(n int) int {
if n == 1 || n == 2 {
return 1
}
return getFb(n-2) + getFb(n-1)
}
5.defer延迟函数
//将一个函数延迟执行;执行到最后时,如果有多个defer,这些defer语句会倒序执行
//注意:参数按代码书写顺序传递,执行的时候真正使用
func main() {
num := 1
f(num)
num++ //2
f(num)
num++ //3
defer f(num)
num++ //4
f(num)
num++ //5
defer f(num)
num++ //6
f(num)
}
func f(num int) {
fmt.Print(num)
}
//执行结果 124653
6.函数的本质
函数的本质就是一个数据类型,不加括号就是个变量,加了括号就是函数调用,函数可以被其他函数变量接收
func main() {
//函数的数据类型
fmt.Printf("函数f1的数据类型为:%T\n", f1) //func()
fmt.Printf("函数f2的数据类型为:%T\n", f2) //func(int, int) (int, int)
//函数的赋值
var f3 func() = f1 //简化写法:f3 := f1
f3() //打印一句话
}
func f1() {
fmt.Println("打印一句话")
}
func f2(a, b int) (int, int) {
return 0, 0
}
7.匿名函数
/*
格式
结果 := func(参数列表) 返回值类型{
函数体
}(传递的参数)
*/
func main() {
sum := func(a, b int) int {
return a + b
}(1, 2)
fmt.Println(sum)
}
8.高阶函数
一个函数作为另一个函数的参数
// 加法
func add3(a, b int) int {
return a + b
}
// 减法
func sub3(a, b int) int {
return a - b
}
// 高阶函数
func oper(a, b int, fun func(int, int) int) int {
return fun(a, b)
}
func main() {
sum := oper(3, 2, sub3)
fmt.Println(sum)
}
9.闭包结构
/*
闭包的概念:一个外层函数中,有内层函数;在内层函数中,会操作外层函数的局部变量;
并且外层函数的返回值就是这个内层函数;这个结构就叫做闭包结构;
闭包结构的生命周期会发生改变;正常的局部变量会随着函数的调用而创建,随着函数的结束而销毁;
而闭包结构外层函数中的局部变量不会随着外层函数的结束而销毁,因为内层函数还在继续使用;
*/
// 自增
func incr() func() int {
var i int
fun := func() int {
i++
return i
}
return fun
}
func main() {
f1 := incr() //内层函数
v1 := f1()
fmt.Println(v1) //1
v2 := f1()
fmt.Println(v2) //2
fmt.Println("-------------")
f2 := incr() //内层函数
v3 := f2()
fmt.Println(v3) //1
v4 := f1()
fmt.Println(v4) //3
v5 := f2()
fmt.Println(v5) //2
}