Go语言中的匿名函数和闭包,简单理解
匿名函数是一种没有函数名的函数,即定义即使用;闭包作为一种携带状态的函数,我们可以简单地将它理解为“对象”,因为它同时具备状态和行为。
匿名函数
匿名函数没有函数名,只有函数体,它只有在被调用的时候才会初始化。匿名函数一般被当作一种类型赋值给函数类型的变量,经常被用作回调函数。
Go语言的匿名函数的声明样式如下所示:
func(params)(return params) {
function body
}
匿名函数的声明与普通函数的定义基本一致,只是没有名字。我们可以在匿名函数声明之后直接调用它,如下所示:
func (name string) {
fmt.Println("My name is ", name)
}('小明')
在声明匿名函数之后,在其后加上调用的参数列表,即可对匿名函数进行调用。除此之外,我们还可以将匿名函数赋值给函数的变量,用于多次调用或者求值,如下所示:
currentTime := func() {
fmt.Println(time.Now())
}
// 调用匿名函数
currentTime()
上述例子中,通过匿名函数实现了一个简单的报时器,并赋值给 currentTime,我们每次调用 currentTime 都能知道当前系统的最新时间。
匿名函数一个比较常用的场景是用作回调函数。
实例:使用回调函数处理字符串
它接收 string 和匿名函数的参数输入,然后使用匿名函数对 string 进行处理。
package main
import "fmt"
func proc(input string, proessor func(str string)) {
// 调用匿名函数
processor(input)
}
func main() {
proc("小明", func(str string) {
for _, v := range str {
fmt.Printf("%c\n", v)
}
})
闭包
所谓闭包指的是引用了自由变量(未绑定到特定对象的变量,通常在函数外定义)的函数,被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的上下文环境也不会被释放(比如传递到其他函数或对象中)。简单来说,「闭」的意思是「封闭外部状态」,即使外部状态已经失效,闭包内部依然保留了一份从外部引用的变量。
显然,闭包只能通过匿名函数实现,我们可以把闭包看作是有状态的匿名函数,反过来,如果匿名函数引用了外部变量,就形成了一个闭包(Closure)。
闭包的价值在于可以作为持有外部变量的函数对象或者匿名函数,对于类型系统而言,这意味着不仅要表示数据还要表示代码。支持闭包的语言都将函数作为第一类对象(firt-class object,有的地方也译作第一级对象、一等公民等,都是一个意思),Go 语言也不例外,这意味 Go 函数和普通 Go 数据类型(整型、字符串、数组、切片、字典、结构体等)具有同等的地位,可以赋值给变量,也可以作为参数传递给其他函数,还能够被函数动态创建和返回。
闭包是携带状态的函数,它是将函数内部和函数外部连接起来的桥梁。通过闭包,我们可以读取函数内部的变量。我们也可以使用闭包封装私有状态,让它们常驻于内存当中。
闭包能够引用其作用域上部的变量并进行修改,被捕获到闭包中的变量将随着闭包的生命周期一直存在,函数本身是不存在信息的,但是闭包中的变量使闭包本身具备了存储信息的能力。
注:所谓第一类对象指的是运行期可以被创建并作为参数传递给其他函数或赋值给变量的实体,在绝大多数语言中,数值和基本类型都是第一类对象,在支持闭包的编程语言中(比如 Go、PHP、JavaScript、Python 等),函数也是第一类对象,而像 C、C++ 等不支持匿名函数的语言中,函数不能在运行期创建,所以在这些语言中,函数不是不是第一类对象。
实例:利用闭包的特效实现一个简单的计数器
package main
import "fmt"
func createCounter(initial int) func() int {
if initial < 0 {
initial = 0
}
// 引用 initial,创建一个闭包
return func() int {
initial++
// 返回当前计数
return initial;
}
}
func main() {
// 计数器 1
c1 := createCounter(1)
fmt.Println(c1()) // 2
fmt.Println(c2()) // 3
// 计数器 2
c2 := createCounter(10)
fmt.Println(c2()) // 11
fmt.Println(c1()) // 4
}
不同的闭包之间变量不会互相干扰,c1和c2两个计数器都是独立进行计数。
Go语言中的匿名函数和闭包,简单理解的更多相关文章
- Go语言中的匿名函数和闭包的样子
1). 函数也是值,可以像普通值那样,传来传去: 2). 匿名函数: 3). 函数的类型,类似于:func(float64,float64) float64 ===================== ...
- 【Go语言学习】匿名函数与闭包
前言 入坑 Go 语言已经大半年了,却没有写过一篇像样的技术文章,每次写一半就搁笔,然后就烂尾了. 几经思考,痛定思痛,决定金盆洗手,重新做人,哦不,重新开始写技术博文. 这段时间在研究Go语言闭包的 ...
- js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题)
js循环函数中的匿名函数和闭包问题(匿名函数要用循环中变量的问题) 一.总结 需要好好看下面代码 本质是因为匿名函数用到了循环中的变量,而普通方式访问的话,匿名函数的访问在循环之后,所以得到的i是循环 ...
- Golang中的匿名函数(闭包)
GO语言的匿名函数就是闭包,以下是<GO语言编程>中对闭包的解释 基本概念闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代 ...
- php中的匿名函数和闭包(closure)
一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...
- 转:php中的匿名函数和闭包(closure)
一:匿名函数 (在php5.3.0 或以上才能使用) php中的匿名函数(Anonymous functions), 也叫闭包函数(closures), 允许指定一个没有名称的函数.最常用的就是回调函 ...
- php匿名函数和闭包的理解
PHP匿名函数和闭包使用的句法与普通函数相同,但匿名函和闭包数其实是伪装成函数的对象. 匿名函数:就是没有名称的函数.匿名函数可以赋值给变量,对象传递.不过匿名函数仍是函数,因此可以调用,还可以传入参 ...
- javascript匿名函数及闭包深入理解及应用
1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种: ...
- js匿名函数和闭包总结
js匿名函数和闭包总结 一.总结 一句话总结:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁.内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕.闭包可以用 ...
- javascript进阶课程--第三章--匿名函数和闭包
javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...
随机推荐
- UML之集合类型
无论何时当我们要使用一个多值对象时,我们必须要清楚两个问题,一是这些值的顺序重要吗?二是允许重复值的存在吗?在编程语言中还会有其他的明确的信息,在UML中,只需明确这两个问题的答案即可确定对应的集合类 ...
- 在 Development 环境下依赖注入的行为可能有所不同
奇怪的问题 本周被一个奇怪的问题困扰了一天.事情的起因是这样的:在某个 PR 合并后,我拉了最新代码,但是在我本地F5调试始终报错.示例代码如下: public interface Interface ...
- 让 LLM 来评判 | 基础概念
基础概念 这是 让 LLM 来评判 系列文章的第一篇,敬请关注系列文章: 基础概念 选择 LLM 评估模型 设计你自己的评估 prompt 评估你的评估结果 奖励模型相关内容 技巧与提示 什么是评估模 ...
- 巧用VTable打造炫酷金字塔图表
在数据分析和可视化领域,表格是展示数据直观.有效的方式之一.今天,就让我们来探索如何利用VTable这个强大的表格组件,制作出既美观又富有信息量的金字塔图表,以及深入了解VTable中各种单元格类型的 ...
- 【java提高】---细则(3)
HashSet 与TreeSet和LinkedHashSet的区别 今天项目开发,需要通过两个条件去查询数据库数据,同时只要满足一个条件就可以取出这个对象.所以通过取出的数据肯定会有重复,所以要去掉重 ...
- 远程连接Windows
远程桌面连接 限制 1.同网段 (1)服务器关闭防火墙 (2)服务器端 右键点击'我的电脑'进入'属性'点击左侧菜单栏中的'远程设置': 把远程桌面选项设置成'允许运行任意版本远程桌面的计算机连接'. ...
- Windows 激活
参考:链接1 链接2 链接3 链接4
- Nukem pg walkthrough Intermediate
nmap 扫描 ┌──(root㉿kali)-[~] └─# nmap -p- -A 192.168.157.105 Starting Nmap 7.94SVN ( https://nmap.org ...
- 边缘计算与MEC浅谈
本文分享自天翼云开发者社区<边缘计算与MEC浅谈>,作者:y****n 一.什么是边缘计算 边缘计算是在靠近物或数据源头的网络边缘侧,通过融合网络.计算.存储.应用核心能力的分布式开放平台 ...
- HTML标签-form表单
HTML标签-form表单 在Web开发中,HTML表单(form)是不可或缺的一部分,它承担着用户与Web服务器之间交互的重任.今天,我们就来详细探讨一下HTML中的form表单标签. 一.form ...