Golang函数-匿名函数与闭包函数
2024-08-28 07:19:03
Golang函数-匿名函数应用案例回调函数和闭包函数
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.匿名函数概述
什么是匿名函数:
顾名思义,就是没有函数名,只有函数体,函数可以被作为一种类型被赋值给函数类型的变量,匿名函数往往以变量方式被传递。Go是支持匿名函数的,即在需要使用函数时再定义函数 Go域名函数定义就是没有名字的普通函数,定义格式如下:
func (参数列表) (返回值列表){
函数体
}
二.定义匿名函数
1>.定义匿名函数时直接调用
package main import (
"fmt"
) func main() { /*
定义匿名函数时直接调用
*/
res := func(x int, y int) (z int) {
z = x + y
return z
}(100, 20) fmt.Printf("res的类型为[%T],res的值为[%d]\n", res, res)
}
2>.先声明匿名函数,再调用匿名函数
package main import (
"fmt"
) func main() { /*
定义匿名函数,此时add是一个函数类型,只不过它是一个匿名函数。
*/
add := func(x int, y int) (z int) {
z = x + y
return z
}
fmt.Printf("add的类型为[%T]\n", add) /*
我们可以通过函数类型add来多次调用匿名函数
*/
res1 := add(100, 200)
res2 := add(300, 500)
fmt.Printf("res1的类型为[%T],res1的值为[%d]\n", res1, res1)
fmt.Printf("res2的类型为[%T],res2的值为[%d]\n", res2, res2)
}
3>.匿名函数可以作为返回值被多次调用
package main import (
"fmt"
) //使用type来定义一个匿名函数类型
type FUNCTYPE func(int, int) int func demo() FUNCTYPE {
/*
demo的返回值为我们上面定义的匿名函数类型
*/
return func(x int, y int) int {
res := x + y
return res
}
} func main() {
/* add的类型为(匿名)函数类型
*/
add := demo()
fmt.Printf("add的类型为[%T],add匿名函数的内存地址是[%X]\n", add, add) /*
我们可以通过函数类型add来多次调用匿名函数
*/
res1 := add(100, 200)
res2 := add(300, 500)
fmt.Printf("res1的类型为[%T],res1的值为[%d]\n", res1, res1)
fmt.Printf("res2的类型为[%T],res2的值为[%d]\n", res2, res2)
}
三.匿名函数的应用场景(匿名函数经常被用于实现回调函数,闭包等)
1>.回调函数案例
package main import (
"fmt"
) /*
函数回调:
简称回调,英文名为:"Callback",即"call then back",被主函数调用运算后会返回主函数。
是指通过函数参数传递到其它代码的,某一块可执行代码的引用 匿名函数作为回调函数的设计在Go语言的系统包中是很常见的,比如strings包中又有着中实现,代码如下所示:
func TrimFunc(s string, f func(rune) bool) string{
return TrimRightFunc(TrimLeftFunc(s,f),f)
}
*/
func callback(f func(int, int) int) int {
return f(10, 20)
} func add(x int, y int) int {
return x + y
} func main() {
/*
匿名函数(函数名本身是代码区的一个地址)的用途非常广泛,匿名函数本身是一种值,可以方便的保存在各种容器中实现回调函数和操作封装
*/
fmt.Println(add) /*
函数回调操作
*/
fmt.Println(callback(add))
}
2>.闭包函数案例
package main import (
"fmt"
) /*
什么是闭包函数:
闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。
闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。 Go语言支持匿名函数作为闭包。匿名函数是一个"内联"语句或表达式。 下面实例中,创建了函数"getSequence()",返回另外一个匿名函数"func() int"。该函数的目的在闭包中递增number变量。
*/
func getSequence() func() int {
number := 100
return func() int {
/*
匿名函数的优越性在于可以直接使用函数内的变量,不必声明。
*/
number += 1
return number
}
} func main() {
/*
f1为一个空参匿名函数类型,number变量的值依旧为100
*/
f1 := getSequence() /*
调用f1函数,number变量自增1并返回
*/
fmt.Println(f1())
fmt.Println(f1())
fmt.Println(f1()) fmt.Println("=====我是分割线=====")
/*
创建新的匿名函数 f2,并查看结果
*/
f2 := getSequence()
fmt.Println(f2())
fmt.Println(f2())
}
最新文章
- Java总结篇系列:java.lang.Object
- 透明、圆角、阴影效果、背景色渐变、<;a>;<;/a>;去外层虚线、!!!表格标签<;table>;
- iOS一分钟学会环形进度条
- Fedora 20下安装官方JDK替换OpenJDK并配置环境变量
- git ssh key for github
- Nuget
- 使用gdb跟踪Linux内核启动过程(从start_kernel到init进程启动)
- 瑕疵(bug)严重性定义
- java中怎么进行字符串替换?
- 未能写入输出文件 c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary
- JAVA线程池原理详解(1)
- HTML入门9
- 如何快速地开发一个微信小程序
- windows入侵
- 日志收集(ElasticSearch)串联查询 MDC
- Selenium IDE 宏 试用 一例
- base标签对svg的影响
- P1005 矩阵取数游戏(动态规划+高精度)
- 关于SharedPreferences存储数据的使用方法
- AspNetPager + GridView + ASP.NET AJAX 分页无刷新实现
热门文章
- Linux centosVMware 自动化运维认识自动化运维、启动salt相关服务、saltstack配置认证、salt-key命令用法、saltstack远程执行命令、saltstack - grains、saltstack – pillar
- Linux centosVMware Linux集群架构LVS DR模式搭建、keepalived + LVS
- python3 使用selenium +webdriver打开chrome失败,报错:FileNotFoundError: [Errno 2] No such file or directory: &#39;chromedriver&#39;: &#39;chromedriver&#39;
- 1.requests+正则表达式爬猫眼电影TOP100
- mac允许安装任何来源的软件
- 洛谷 P3320 [SDOI2015]寻宝游戏
- 全方位深入理解JavaScript面向对象
- 标准模板库中的栈(stack)
- rally问题合集
- 小笔记----about JC