Golang回调函数与闭包和接口函数的定义及使用介绍

作者:shade7 时间:2024-04-26 17:27:22 

回调函数

定义

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

eg:js接口回调函数,gin handler

意义

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

闭包

定义

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

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

eg:

func adder() func(x int)int{
   i:=10  //adder()里的局部变量i可以被fn和fn1访问到,并且每一个闭包实例里i都有自己的值
   return func()int{
       return i+x
   }
}
func main() {
   fn := adder()
   fmt.Println(fn(10))  //20
   fmt.Println(fn(10))  //30
   fn1 := adder()
   fmt.Println(fn1(10))  //20
   fmt.Println(fn1(10))  //30
}

意义

全局变量:

1.常驻内存

2. 污染全局

局部变量:

1.不常驻内存

2.不污染全局

而Go语言的闭包:

1.可以让变量常驻内存

2.可以让变量不污染全局

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

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

接口函数

定义

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

意义

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

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

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

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

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

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

来源:https://blog.csdn.net/shade7/article/details/127847006

标签:Golang,回调函数,闭包,接口函数
0
投稿

猜你喜欢

  • Vue+express+Socket实现聊天功能

    2024-06-05 09:19:03
  • 快速解决 MySQL中与浮点比较有关的问题

    2008-11-27 16:28:00
  • Go之interface的具体使用

    2024-02-08 18:58:41
  • Python爬虫之pandas基本安装与使用方法示例

    2023-11-26 21:49:35
  • Python爬取动态网页中图片的完整实例

    2023-11-12 20:29:27
  • 教你安装python Django(图文)

    2023-11-13 14:22:39
  • 浅谈sklearn中predict与predict_proba区别

    2023-11-08 03:53:45
  • python函数返回多个值的示例方法

    2023-04-14 10:38:05
  • 使用Python+Appuim 清理微信的方法

    2021-05-24 12:22:05
  • Python 格式化输出_String Formatting_控制小数点位数的实例详解

    2023-11-29 12:09:14
  • php查找指定目录下指定大小文件的方法

    2023-09-03 17:53:36
  • python3中dict(字典)的使用方法示例

    2022-06-14 11:44:39
  • 简单理解vue中track-by属性

    2024-04-30 10:21:05
  • Go语言入门exec的基本使用示例

    2024-04-25 13:16:33
  • Win7的IIS7中ASP获得的系统日期格式为斜杠的解决办法

    2012-12-04 19:57:33
  • 动态程序防采集的新方法

    2010-04-24 15:24:00
  • mysql启用skip-name-resolve模式时出现Warning的处理办法

    2024-01-20 06:44:58
  • 浅谈python中的实例方法、类方法和静态方法

    2022-02-10 07:11:27
  • Windows平台Python连接sqlite3数据库的方法分析

    2024-01-25 14:04:28
  • vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native

    2023-07-02 17:01:35
  • asp之家 网络编程 m.aspxhome.com