• Golang 回调函数&&闭包&&接口函数


    回调函数

    定义

    回调函数是把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。
    eg:js接口回调函数,gin handler

    意义

    回调函数是用户实现异步的一种方式:把处理函数注册为一个路由的回调函数,当有请求后自动调用回调函数;这样主程序的执行,就不受到请求的影响,实现了异步。当然这里的异步机制由epoll实现,不能算严格意义上的异步。

    闭包

    定义

    闭包指的是一个函数和与其相关的引用环境组合而成的实体;简单来说,闭包=函数+引用环境。

    闭包是指有权访问另一个函数作用域中的变量的函数;创建闭包的常见方式就是在一个函数内部创建另一个函数, 内函数可以访问外函数的变量。

    eg:

    1. func adder() func(x int)int{
    2. i:=10 //adder()里的局部变量i可以被fn和fn1访问到,并且每一个闭包实例里i都有自己的值
    3. return func()int{
    4. return i+x
    5. }
    6. }
    7. func main() {
    8. fn := adder()
    9. fmt.Println(fn(10)) //20
    10. fmt.Println(fn(10)) //30
    11. fn1 := adder()
    12. fmt.Println(fn1(10)) //20
    13. fmt.Println(fn1(10)) //30
    14. }

     

    意义

    全局变量:
    1.常驻内存
    2. 污染全局

    局部变量:
    1.不常驻内存
    2.不污染全局

    而Go语言的闭包:
    1.可以让变量常驻内存
    2.可以让变量不污染全局

    所以闭包主要是为了避免全局变量的滥用。

    闭包里作用域返回的局部变量不会被立刻销毁回收,但过度使用闭包可能会占用更多内存,导致性能下降。

    接口函数

    定义

    函数类型实现某一个接口,称之为接口型函数,接口型函数只能应用于接口内部只定义了一个方法的情况。

    意义

    方便使用者在调用时既能够传入函数作为参数,也能够传入实现了该接口的结构体作为参数。

    当接口作为参数时:我们可以选择两种接口实现方式,接口函数实现接口和结构体实现接口。

    当逻辑较为复杂的场景,如果对数据库的操作需要很多信息,地址、用户名、密码,还有很多中间状态需要保持,比如超时、重连、加锁等等。这种情况下,更适合封装为一个结构体作为参数。

    当逻辑较为简单时,可以直接传入接口函数。

    1. func test(key string) ([]byte, error) {
    2. return []byte(key), nil
    3. }
    4. func main() {
    5. GetFromSource(GetterFunc(test), "hello")
    6. }
    7. //将 test 强制类型转换为 GetterFunc,GetterFunc 实现了接口 Getter,是一个合法参数。这种方式适用于逻辑较为简单的场景。

    这样既能够将普通的函数类型(需类型转换)作为参数,也可以将结构体作为参数,使用更为灵活,可读性也更好,这就是接口型函数的价值。

  • 相关阅读:
    【亲妈教学】配置Gzip压缩,含前后端步骤
    用VS Code搞Qt6:编译源代码与基本配置
    计算机毕业设计springboot+vue+elementUI学生公寓管理系统
    【Flink、java】
    太空 5G 在启动板上
    mui tap事件,mui.confirm弹窗出现两次
    抖音视频评论自动回复与主动回复的实现
    Spring-Aop面向切面编程
    protobuf 基本语法总结
    OpenCV3.4.12&opencv_contrib编译静态库
  • 原文地址:https://blog.csdn.net/shade7/article/details/127847006