Golang的匿名函数和闭包
1、匿名函数(anonymous)
匿名函数是一种没有函数名的函数。
在声明匿名函数之后,在其后加上调用的参数列表,即可对匿名函数进行调用
匿名函数有两种调用执行方式:
(1)将匿名函数保存到变量,通过变量执行
(2)自执行匿名函数:在匿名函数后加调用的参数列表"()",即可对匿名函数进行立即调用
func main() {// 将匿名函数保存到变量add := func(x, y int) {fmt.Println(x + y)}add(10, 20) // 通过变量调用匿名函数//自执行匿名函数:匿名函数定义完加()直接执行func(x, y int) {fmt.Println(x + y)}(10, 20)
}
2、闭包(Closure)
闭包=匿名函数+引用环境(外层代码定义的变量),即有状态的匿名函数,也可以说:如果匿名函数引用了外部变量,就形成了一个闭包.
在闭包的生命周期内,引用环境即变量也一直有效,会常驻于内存当中。
函数本身是不存在信息的,但是闭包中的变量使闭包本身具备了存储信息的能力。
func makeSuffixFunc(suffix string) func(string) string {return func(name string) string {if !strings.HasSuffix(name, suffix) {return name + suffix}return name}
}func main() {jpgFunc := makeSuffixFunc(".jpg")txtFunc := makeSuffixFunc(".txt")fmt.Println(jpgFunc("test")) //test.jpgfmt.Println(txtFunc("test")) //test.txt
}
闭包像go协程一样在for循环时存在延迟绑定的问题。
实践:
func main() {arr := []float64{1, 9, 16}visit(arr, func(v float64) {v = math.Sqrt(v)fmt.Println("平方根", v)})visit(arr, func(v float64) {v = math.Pow(v, 2)fmt.Println("平方", v)})f2 := makeSuffix(".log")fmt.Println(f2("access"))fmt.Println(f2("access.log"))
}// 函数做参数,可以抽象出部分公共逻辑,抽出了循环操作
func visit(lst []float64, f func(float64)) {for _, value := range lst {f(value)}
}// 函数做返回值,根据不同情形做一件相似的事,检测是否有后缀
func makeSuffix(suffix string) func(string) string {return func(name string) string {if !strings.HasSuffix(name, suffix) {return name + suffix}return name}
}
Golang的匿名函数和闭包相关推荐
- php的匿名函数和闭包函数
php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...
- go语言中利用匿名函数和闭包实现文件名修改
package mainimport ("fmt""strings" )//利用匿名函数和闭包实现文件后缀修改 func makeSuffix(suffix s ...
- JavaScript 匿名函数与闭包
匿名函数与闭包 匿名函数 闭包 概念 相关知识点 闭包中的this 循环函数中的匿名函数和闭包 循环函数中的匿名函数 循环函数中的闭包 模仿块级作用域 私有变量 静态私有变量 匿名函数 没有函数名的函 ...
- javascript进阶课程--第三章--匿名函数和闭包
javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...
- Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...
Scala高级特性 1. 学习目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- JavaScript匿名函数和闭包
概述 在JavaScript前端开发中,函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure).也就是说,闭包可以让你从内部函数访问外部函数作用域.在J ...
- js 匿名函数和闭包
匿名函数和闭包 转https://www.cnblogs.com/xiaowie/p/10277483.html 填写了注释 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明: ...
- php 匿名函数好处,谈谈PHP中的匿名函数与闭包
//匿名函数,说白了就是"没有名字的函数",不多说.给一段代码可能更为明白: //例一,定义匿名函数并调用 $str='world'; $func=function ($str) ...
- 深入理解Java Lambda表达式,匿名函数,闭包
前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...
最新文章
- 09JavaScript中的作用域
- confluence中org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed的解决方法
- java cookie共享_JavaWeb的session及其共享技术
- 张新、黎民、王亮三位老师分别来自湖南、广西、甘肃,分别教语文、数学和英语。已知:(1)张新不是湖南人,黎明不是广西人;(2)湖南的老师不教英语;(3)广西的老师教语文;(4)黎民不教数学。由此可知,王
- linux定时任务实例,linux定时任务访问url实例
- Camel 2.11 –具有URL重写功能的HTTP代理路由
- python--批量下载豆瓣图片
- android 6.0电池优化,Android 优化——电量优化
- C#中的表达式与运算符
- PAT甲级1022 map、set的使用
- SLAM学习笔记 - ORB_SLAM2源码运行及分析
- 批量修改txt文件名,删除相同部分
- Python实现SM4算法
- python机器学习实例
- 【转】福昕pdf套件注册码激活
- 在WIN2012R2和WIN2016服务器打开网站慢的解决方法
- 用链接法实现散列表构造和查找
- 电脑端如何隐藏显示CAD图层内容
- 程序员学历不好是硬伤?苹果公司 50% 员工没大学学历
- echarts折现图的配置