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

 更新时间:2023年05月19日 10:28:58   作者:shade7  
这篇文章主要介绍了Golang回调函数与闭包和接口函数的定义及使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

回调函数

定义

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

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,是一个合法参数。这种方式适用于逻辑较为简单的场景。

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

到此这篇关于Golang回调函数与闭包和接口函数的定义及使用介绍的文章就介绍到这了,更多相关Golang回调函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文带你了解Go中跟踪函数调用链的实现

    一文带你了解Go中跟踪函数调用链的实现

    这篇文章主要为大家详细介绍了go如何实现一个自动注入跟踪代码,并输出有层次感的函数调用链跟踪命令行工具,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • golang 原生database\sql 的重连机制实现

    golang 原生database\sql 的重连机制实现

    本文主要介绍了golang 原生database\sql 的重连机制实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-02-02
  • Golang中异常处理机制详解

    Golang中异常处理机制详解

    这篇文章主要给大家介绍了关于Golang中异常处理机制的相关资料,其实Go语言的异常捕获要比Python中简单的多,它没有Python中那么多复杂的异常类型及继承体系,需要的朋友可以参考下
    2021-06-06
  • go 下载非标准库包(部份包被墙了)到本地使用的方法

    go 下载非标准库包(部份包被墙了)到本地使用的方法

    今天小编就为大家分享一篇go 下载非标准库包(部份包被墙了)到本地使用的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • GoLang内存模型详细讲解

    GoLang内存模型详细讲解

    go官方介绍go内存模型的时候说:探究在什么条件下,goroutine 在读取一个变量的值的时,能够看到其它 goroutine 对这个变量进行的写的结果,Go内存模型规定了一些条件,在这些条件下,在一个goroutine中读取变量返回的值能够确保是另一个goroutine中对该变量写入的值
    2022-12-12
  • 基于golang如何实现error工具包详解

    基于golang如何实现error工具包详解

    Go 语言使用 error 类型来返回函数执行过程中遇到的错误,下面这篇文章主要给大家介绍了关于如何基于golang实现error工具包的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-09-09
  • 通过手机案例理解Go设计模式之装饰器模式的功能属性

    通过手机案例理解Go设计模式之装饰器模式的功能属性

    这篇文章主要为大家介绍了Go设计模式之装饰器模式的功能属性,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • vscode如何debug调试golang代码

    vscode如何debug调试golang代码

    古话说工欲善其事必先利其器,Go语言程序的开发者而言,当下最火的IDE应该非微软的Visual Studio Code莫属,本文主要介绍了vscode如何debug调试golang代码,感兴趣的可以了解一下
    2024-03-03
  • 一文搞懂Golang中的内存逃逸

    一文搞懂Golang中的内存逃逸

    我们都知道go语言中内存管理工作都是由Go在底层完成的,这样我们可以不用过多的关注底层的内存问题。本文主要总结一下 Golang内存逃逸分析,需要的朋友可以参考以下内容,希望对大家有帮助
    2022-09-09
  • 如何解析golang中Context在HTTP服务中的角色

    如何解析golang中Context在HTTP服务中的角色

    这篇文章主要介绍了如何解析golang中Context在HTTP服务中的角色问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03

最新评论