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 让我 ...
最新文章
- 1071 Speech Patterns 需再做
- 15.4 xshell使用xftp传输文件;15.5 使用pure-ftpd搭建ftp服务
- java-StringBuffer构造方法
- 使用Numpy和Opencv完成图像的基本数据分析(Part II)
- mysql 升序_mysql 的 查找 与 排序
- tomcat ---- 常用服务器
- 用CommonDialog公共对话框选取多个文件
- 鸿蒙2.0手机版体验,华为鸿蒙OS 2.0手机版功能抢先曝光:体验前所未有
- 联通实时计算平台演进与实践
- 三人抢答器逻辑电路图_数字电路3人抢答器实验报告.doc
- 微信公众号配置JSAPI支付
- 2022抖音日活用户超8亿,旅游商家如何从抖音获客?
- Centos8装Wine笔记
- lucas–kanade_异常检测常用光流法量化对比:Farneback/Horn-Schunck / Lucas–Kanade
- 少儿计算机兴趣小组活动记录,小学美术兴趣小组活动记录-(一).doc
- 网站备案 服务器不在一个地方,域名和服务器不在一个 如何备案
- 蓝桥杯试题:求数差(简单易懂无脑)java
- 电脑用户名中文改英文步骤总结
- 【Vue学习笔记】尚硅谷Vue2.0+Vue3.0全套教程丨vue.js从入门到精通
- vue-cli中mock本地json数据踩雷:报错404 (GET http://localhost:8080/goods 404 (Not Found) )