golang中匿名函数的应用-回调函数-闭包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | 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 } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)