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


猜你喜欢
- win2000注册表程序 regedt32.exe下面是解决IIS出现Active Server Pages错误&
- 介绍我们用django在本地调试完了之后,会在服务器上进行部署,如果是大佬那就忽略本文章,如果是萌新对编程命令不太熟悉,那就要用到宝塔了。流
- Mysql是主流的开源关系型数据库,提供高性能的数据存储服务。在做后端开发时,有时会遇到性能瓶颈,这些瓶颈有时并不是来自应用本身,而是来自数
- 1. 开发1.1. 架构Gorm使用可链接的API,*gorm.DB是链的桥梁,对于每个链API,它将创建一个新的关系。db, err :=
- 上节我们提到解决赋值中等号两边参数不一致的方法可以通过切片,但在Python3中我们可以利用特定的语法更加方便的处理这种情况,如下示例。当带
- 将PHP的执行页面预先转换成HTML,是所谓的PHP静态化方法之一。其他还有模板替换法,opcache等方法。静态化的作用:提高网站的响应速
- 在做web应用的自动化测试时,定位元素是必不可少的,这个过程经常会碰到定位不到元素的情况(报selenium.common.exceptio
- var sss=(String.fromCharCode(127)); var xmlhttp =
- 前言大家都知道,早期的XMLHttpRequest不支持文件上传,一般用第三方js插件或者flash,现在可以借助XMLHttpReques
- 在上一篇用JS实现图片轮播效果代码(一)的基础上,增加了左右箭头的响应事件,实现了点击左右箭头也可以让图片滚动:js代码如下:window.
- asp禁止站外盗链,站外提交方法、以及asp判断星期几方法.防盗链,主要通过判断上一页面来源是否是本站来实现的,不是本站的链接就
- python实战,用户答题分享给大家。主要包含内容,文件的读取,更改,保存。不同文件夹引入模块。输入,输出操作。随机获取数据操作随机生成算数
- 这篇文章主要介绍了wxpython自定义下拉列表框过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 安装 Java 语言的软件开发工具包brew cask install java或者在Oracle官网 中选择 Mac 版本 jdk-8u1
- requests 是一个非常小巧全面的库,应用它可以很容易写出与服务器进行交互的程序,今天遇到了一个问题,与服务器交互时,url都是http
- 感谢LeXRus为我们带来他费心制作的教程,这是一个非常棒的动画教程,教程中不仅有 DW MX 2004 的操作方法,还有一些代码的写作和方
- 一、前情提要最近在写一个项目,需要用到子线程,但是我们小学二年级就学过操作系统, 线程的执行是由系统的CPU调度算法所决定的,调度算法按照一
- Spring @Enable 模块概览框架实现@Enable注解模块激活模块Spring Framework@EnableWebMvcWeb
- 思路:1.读取所有文章标题;2.用“结巴分词”的工具包进行文章标题的词语分割;3.用“sklearn”的工具包计算Tf-idf(词频-逆文档
- atom(一款开源的代码编辑器)是github专门为程序员推出的一个跨平台文本编辑器。具有简洁和直观的图形用户界面,并有很多有趣的特点:支持