004.Go语言中的函数

目录

1.函数的格式

2.函数定义的几种形式

3.函数传递可变参数

4.递归函数

5.defer延迟函数

6.函数的本质

7.匿名函数

8.高阶函数

9.闭包结构


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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值