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的匿名函数和闭包相关推荐

  1. php的匿名函数和闭包函数

    php的匿名函数和闭包函数 tags: 匿名函数 闭包函数 php闭包函数 php匿名函数 function use 引言:匿名函数和闭包函数都不是特别高深的知识,但是很多刚入门的朋友却总是很困惑,因 ...

  2. go语言中利用匿名函数和闭包实现文件名修改

    package mainimport ("fmt""strings" )//利用匿名函数和闭包实现文件后缀修改 func makeSuffix(suffix s ...

  3. JavaScript 匿名函数与闭包

    匿名函数与闭包 匿名函数 闭包 概念 相关知识点 闭包中的this 循环函数中的匿名函数和闭包 循环函数中的匿名函数 循环函数中的闭包 模仿块级作用域 私有变量 静态私有变量 匿名函数 没有函数名的函 ...

  4. javascript进阶课程--第三章--匿名函数和闭包

    javascript进阶课程--第三章--匿名函数和闭包 一.总结 二.学习要点 掌握匿名函数和闭包的应用 三.匿名函数和闭包 匿名函数 没有函数名字的函数 单独的匿名函数是无法运行和调用的 可以把匿 ...

  5. Scala 高阶函数(作为值的函数、匿名函数、闭包、柯里化)+隐式转换和隐式参数...

    Scala高级特性 1.    学习目标 1.1.   目标一:深入理解高阶函数 1.2.   目标二:深入理解隐式转换 2.    高阶函数 2.1.   概念 Scala混合了面向对象和函数式的特 ...

  6. JavaScript匿名函数和闭包

    概述 在JavaScript前端开发中,函数与对其状态即词法环境(lexical environment)的引用共同构成闭包(closure).也就是说,闭包可以让你从内部函数访问外部函数作用域.在J ...

  7. js 匿名函数和闭包

    匿名函数和闭包 转https://www.cnblogs.com/xiaowie/p/10277483.html 填写了注释 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明: ...

  8. php 匿名函数好处,谈谈PHP中的匿名函数与闭包

    //匿名函数,说白了就是"没有名字的函数",不多说.给一段代码可能更为明白: //例一,定义匿名函数并调用 $str='world'; $func=function ($str) ...

  9. 深入理解Java Lambda表达式,匿名函数,闭包

    前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...

最新文章

  1. 09JavaScript中的作用域
  2. confluence中org.apache.tomcat.util.net.NioEndpoint$Acceptor.run Socket accept failed的解决方法
  3. java cookie共享_JavaWeb的session及其共享技术
  4. 张新、黎民、王亮三位老师分别来自湖南、广西、甘肃,分别教语文、数学和英语。已知:(1)张新不是湖南人,黎明不是广西人;(2)湖南的老师不教英语;(3)广西的老师教语文;(4)黎民不教数学。由此可知,王
  5. linux定时任务实例,linux定时任务访问url实例
  6. Camel 2.11 –具有URL重写功能的HTTP代理路由
  7. python--批量下载豆瓣图片
  8. android 6.0电池优化,Android 优化——电量优化
  9. C#中的表达式与运算符
  10. PAT甲级1022 map、set的使用
  11. SLAM学习笔记 - ORB_SLAM2源码运行及分析
  12. 批量修改txt文件名,删除相同部分
  13. Python实现SM4算法
  14. python机器学习实例
  15. 【转】福昕pdf套件注册码激活
  16. 在WIN2012R2和WIN2016服务器打开网站慢的解决方法
  17. 用链接法实现散列表构造和查找
  18. 电脑端如何隐藏显示CAD图层内容
  19. 程序员学历不好是硬伤?苹果公司 50% 员工没大学学历
  20. echarts折现图的配置

热门文章

  1. 【2018年11月21日】煤炭行业的估值高度排名
  2. Ubuntu 修改mysql存放路径后无法启动解决办法
  3. springMVC简单实例
  4. 来来来,一起五句话搞定JavaScript作用域
  5. centos 5 6安装本地yum源
  6. 设计模式--原型模式
  7. python基础学习笔记(十三)
  8. linux 修改系统时区和时间
  9. Linux.Unix.windows的纠结史
  10. [IE编程] 如何获得IE版本号