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
    }
}

  

posted @   专职  阅读(147)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示