golang中匿名函数的应用-回调函数-闭包
package main import (
"fmt"
"strconv"
) type funcType func(int, int) int // 自定义函数类型
type Callback func(int, int) int
type Callback2 func(string) func main() {
// 匿名函数经常被用于回调函数或闭包等 // 1. 定义匿名函数时直接调用
//anonymousFunc1() // 2. 先声明匿名函数,再调用匿名函数
//anonymousFunc2() // 3. 匿名函数可以作为返回值被多次调用
//f11 := anonymousFunc3()
//fmt.Println(f11(11, 22))
//fmt.Println(f11(300, 500)) // 4. 这是一个简单的回调例子,调用函数test时,调用真正的实现函数add
//fmt.Println(test(10, 20, add)) // 5. 这是一个将字符串转为Int的例子,在转换失败的情况下执行回调函数,输出错误信息
fmt.Println(stringToInt("15", errLog))
fmt.Println(stringToInt("15ab", errLog)) // 6. 闭包案例
//f := adder()
//fmt.Println(f())
//fmt.Println(f())
//fmt.Println(f())
//f2 := adder()
//fmt.Println(f2())
//fmt.Println(f2())
} // 方式一,定义匿名函数时直接调用
func anonymousFunc1() {
fmt.Println("anonymouseFunc1执行了")
a := func(data int) int {
fmt.Println("匿名函数执行了", data)
return data + 1
}(100)
fmt.Println(a)
} // 方式二:先声明匿名函数,再调用匿名函数
func anonymousFunc2() {
fmt.Println("anonymousFunc2执行了")
f := func(str string) string {
fmt.Println("匿名函数2执行了")
return str + " world"
}
ret := f("hello")
fmt.Println(ret)
} // 方式三:匿名函数可以作为返回值被多次调用
func anonymousFunc3() funcType {
return func(x, y int) int {
res := x + y
return res
}
} // 方式四:这是一个简单的回调例子,调用函数test时,调用真正的实现函数add
// 回调函数就是一个通过函数指针调用的函数。
// 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
// 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应
func test(x, y int, callback Callback) int {
return callback(x, y)
}
func add(x, y int) int {
return x + y
} // 方式五:这是一个将字符串转为Int的例子,在转换失败的情况下执行回调函数,输出错误信息
func stringToInt(str string, callback Callback2) int64 {
if value, err := strconv.ParseInt(str, 0, 0); err != nil {
callback(err.Error())
return 0
} else {
return value
}
}
func errLog(msg string) { // 记录日志消息的具体实现
fmt.Println(msg)
} // 方式六:作为闭包
// 闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)。
// 闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。
func adder() func() int {
sum := 0
fmt.Println("this line exec")
return func() int {
sum++
return sum
}
}
golang中匿名函数的应用-回调函数-闭包的更多相关文章
- Opengl中的GLUT下的回调函数
void glutDisplayFunc(void (*func)(void)); 注册当前窗口的显示回调函数 参数: func:形为void func()的函数,完成具体的绘制操作 这个函数告诉GL ...
- C语言之函数指针、回调函数的使用
一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...
- VC++的函数指针和回调函数 及友元函数
什么是函数指针 函数指针是指向函数的指针变量.也就是说,它是一个指针变量,而且该指针指向一个函数. 对于指针变量来说,它的值是它指向的变量的地址.举个例子:指针变量pi是指向一个整型变量i的指针,则变 ...
- C 函数指针、回调函数
参考链接:https://www.runoob.com/cprogramming/c-fun-pointer-callback.html 函数指针 函数指针就是执行函数的指针,他可以像正常函数一样去调 ...
- c++指针函数的使用——回调函数
/* 函数指针 函数也是有地址的 所谓函数指针,就是指向函数的指针,函数指针也是一个变量,可以指向不同的函数.同时通过函数指针可以调用其指向函数,从而使函数的调用更加灵活. 函数指针的用途 */ #i ...
- Java通过匿名类来实现回调函数
在C语言中,函数名可以当做函数指针传递给形参从而实现回调 void f1() { printf("f1()\n"); } void f2() { printf("f2() ...
- 详解C#中通过委托来实现回调函数功能的方法
委托:类型安全的指向函数的指针 使用步骤 1:声明一个委托 delegate string DelString(string s) 2:定义一个委托变量 DelString del = new Del ...
- JavaScript ES7 中使用 async/await 解决回调函数嵌套问题
原文链接:http://aisk.me/using-async-await-to-avoid-callback-hell/ JavaScript 中最蛋疼的事情莫过于回调函数嵌套问题.以往在浏览器中, ...
- jQuery中ajax方法无法执行回调函数问题
最近遇到一个问题,发现使用jquery的ajax方法时,回调方法无法执行,而使用$.load()方法时却能正确返回数据.经过长时间调试最终发现是自己粗心大意,原来后台返回的是json数据,而返回的数据 ...
随机推荐
- [Elasticsearch] ES 的Mapping 设计在实际场景中应用
背景 项目中有个需求是需要几个字段作为标签,统计各个标签的文档数量,同时支持分词后的全文检索功能. 原有的mapping设计: curl -XPUT http://ip:9200/meta_es_me ...
- JAVA读取本地html文件里的html文本
/** * 读取本地html文件里的html代码 * @param file File file=new File("文件的绝对路径") * @return */ public s ...
- tomcat startup.bat 启动中文显示乱码
打开tomcat文件夹到conf目录下 修改logging.properties 找到 java.util.logging.ConsoleHandler.encoding = utf-8这行 更改为 ...
- 【LeetCode】165. Compare Version Numbers 解题报告(Python)
[LeetCode]165. Compare Version Numbers 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...
- Beautiful Walls
[1553] Beautiful Walls 时间限制: 1000 ms 内存限制: 65535 K 问题描述 To simplify the building process, XadillaX b ...
- 慢 SQL 优化
# 导致SQL执行慢的原因 1. 硬件问题.如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等. 2. 没有索引或者索引失效.(一般在互联网公司,DBA会在半夜把表锁了,重新建立一遍索引,因为当你 ...
- MyBatis 流式查询
流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果.流式查询的好处是能够降低内存使用. 流式查询的过程当中,数据库连接是保持打开状态的,因此要注意的是:执行一个 ...
- 第十五个知识点:RSA-OAEP和ECIES的密钥生成,加密和解密
第十五个知识点:RSA-OAEP和ECIES的密钥生成,加密和解密 1.RSA-OAEP RSA-OAEP是RSA加密方案和OAEP填充方案的同时使用.现实世界中它们同时使用.(这里介绍的只是&quo ...
- 第十九个知识点:Shamir密钥交换场景
第十九个知识点:Shamir密钥交换场景 Shamir密钥交换场景是一个被Adi Shamir提出的算法.算法允许多方分割一个密码,例如一个密钥.当足够多的秘密结合起来,整个密钥就被计算出来了. 正式 ...
- RabbitMQ学习笔记三:Java实现RabbitMQ之与Spring集成
搭建好maven项目环境,加入RabbitMQ依赖包 <dependency> <groupId>org.springframework.amqp</groupId> ...